2010-11-18 2 views
0

INI 파일 : 주소 = "localhost"를 사용자 이름 = "루트" 암호 = "지정한 패스워드" 데이터베이스 = "yourdatabasename는"ifstream을 사용하여 단어를 읽는 방법? 포함

와 내가 ifstream와 ""둘 사이의 단어를 찾을 필요, 그것을 숯에 넣으십시오.

이 방법이 있습니까 ??

+0

이 거기에 개개의 키 = 값 사이에 개행 문자가 있습니까? – Simone

+0

예 그들 사이에 줄이 있습니다 – Marcus

+0

'char'가 아니라'char'라고 가정합니다.이 것이 인터페이스 요구 사항이 아니라면,'std : : string'. –

답변

0

각 커플 사이에 개행 문자가있는 경우 다음을 수행 할 수 있습니다. 다음과 같이

std::string line; //string holding the result 
char charString[256]; // C-string 

while(getline(fs,line)){ //while there are lines, loop, fs is your ifstream 
    for(int i =0; i< line.length(); i++) { 
     if(line[i] != '"') continue; //seach until the first " is found 

     int index = 0; 
     for(int j= i+1; line[j] != '"'; j++) { 
      charString[index++] = line[j]; 
     } 
     charString[index] = '\0'; //c-string, must be null terminated 

     //do something with the result 
     std::cout << "Result : " << charString << std::endl; 

     break; // exit the for loop, next string 
    } 
} 
+0

Thx,하지만 이걸 프로그램하는 방법을 잘 모르겠다. 도와 주실 수 있습니까? – Marcus

0

나는 그것을 접근하는 것입니다 :

  • 는 이름 - 값 쌍을
  • 사용 std::istream& operator>>(std::istream &, NameValuePair &);를 나타내는 클래스를 만듭니다
당신은 다음과 같이 할 수

:

ifstream inifile(fileName); 
NameValuePair myPair; 
while(ifstream >> myPair) 
{ 
    myConfigMap.insert(myPair.asStdPair()); 
} 

ini 파일에 명명 된 값 쌍이 포함 된 섹션이있는 경우 논리 섹션에서 스트림 오류를 사용하지 않고 상태 시스템과 함께 일종의 추상 팩토리를 사용할 수 있도록 end-of-section을 읽어야합니다. (당신은 무언가를 읽은 다음 당신의 상태를 결정하는 것이 무엇인지 결정합니다.)

스트림을 사용자 이름 - 값 쌍으로 구현하는 경우 getline을 사용하여 인용 부호를 종결 자로 사용할 수 있습니다.

std::istream& operator>>(std::istream& is, NameValuePair & nvPair) 
{ 
    std::string line; 
    if(std::getline(is, line, '\"')) 
    { 
    // we have token up to first quote. Strip off the = at the end plus any whitespace before it 
    std::string name = parseKey(line); 
    if(std::getline(is, line, '\"')) // read to the next quote. 
    { 
     // no need to parse line it will already be value unless you allow escape sequences 
     nvPair.name = name; 
     nvPair.value = line; 
    } 
    } 
    return is; 
} 

토큰을 완전히 구문 분석 할 때까지는 nvPair.name에 기록하지 않았습니다. 스트리밍이 실패하면 우리는 부분적으로 쓰기를 원하지 않습니다.

getline이 실패하면 스트림이 실패 상태로 남습니다. 이는 파일 끝에서 자연스럽게 발생합니다. 파일 끝을 처리하는 잘못된 방법이기 때문에 예외가 발생하면 예외를 throw하지 않습니다. 이름과 값 사이에서 실패하거나 이름 뒤에 꼬리표가 없으면 (그러나 비어 있지 않은 경우) 던져 버릴 수 있습니다. 자연스러운 현상이 아니기 때문입니다.

공백과 심지어 따옴표 사이의 줄 바꿈도 가능합니다. 그들 사이에있는 것이 무엇이든 다른 따옴표 이외에 읽혀집니다. 이들을 허용하기 위해 이스케이프 시퀀스를 사용해야하고 값을 파싱해야합니다.

당신이 \을 사용한 경우 "이스케이프 순서대로 값을 얻을 때 당신이해야한다"루프 "그것은 (견적에 변화뿐만 아니라)를 \로 끝나는, 및 경우를 함께 연결할.

관련 문제