2015-01-06 2 views
0

코드를 테스트하는 동안 더 많은 데이터가 파일에 기록 될 때 ifstream이 업데이트되지 않는 문제가 발생했습니다. 그들이 파일에 기록됩니다 불구하고ofstream을 사용하여 데이터가 파일에 쓰여진 후 ifstream 객체를 업데이트합니다.

ifstream is(filename); 
    string line; 
    while (getline(is, line)) 
     cout << "line: " << line << endl; 

    ofstream os(filename, ofstream::out | ofstream::app); 
    string additional("additional"); 
    os << additional; 
    os.flush(); 

    while (getline(is, line)) 
     cout << "line additional: " << line << endl; 

추가 라인 stdout에 기록되지 않았다 : 그래서 여기에 문제를 보여주는 샘플 코드입니다. 테스트 용으로 필요하기 때문에 if/ofstream 대신에 fstream을 사용하고 있지 않습니다.

ifstream 만드는 방법 파일의 변경 사항을 "확인 하시겠습니까?"

업데이트 : clear 메서드를 사용하여 비트를 지 웠습니다. 내 우분투 컴퓨터에서 gcc를 사용하여 정상적으로 작동합니다. 하지만 llvm을 사용하는 Mac OSX에서는 작동하지 않습니다. 독립적으로 플랫폼을 수행하는 방법을 알고 있습니까?

답변

3

처음 읽을 때 입력 스트림에서 std::ios::clear을 호출해야합니다. 전체 파일을 읽을 때 스트림에 오류 비트를 설정하고 파일이 실제로 변경된 경우에도 읽기를 거부합니다.

ifstream is(filename); 
string line; 
while (getline(is, line)) 
    cout << "line: " << line << endl; 

ofstream os(filename, ofstream::out | ofstream::app); 
string additional("additional"); 
os << additional; 
os.flush(); 

is.clear(); //< Now we can read again 
while (getline(is, line)) 
    cout << "line additional: " << line << endl; 
+0

당신은 절대적으로 옳습니다. 나는 대답을 고쳤습니다. 고마워요! – tux3

+0

고마워요! 나는 eofbit과 failbit를 설정 했으므로 근본적으로 문제가되지 않는다. 나는 단지 그것을 지우고 우분투에서 잘 작동한다. gcc. Mac OSX, llvm에서는 작동하지 않지만. 어떤 아이디어? 불행히도 Mac에서는 lldb를 사용하여 디버깅 할 수 없습니다. – rightaway717

+0

@ rightaway717 LLVM의 버그입니다. – 0x499602D2

0

나는 이유는 지금은 "ofstream :: 아웃"즉시 그것을 열릴 때 파일을 자릅니다

ofstream os(filename, ofstream::out | ofstream::app); 

"ofstream :: 아웃"을 사용하여 출력 스트림 파일을 열 것으로 생각합니다. 즉, 파일의 모든 이전 내용이 열리면 삭제됩니다. 대신를 사용하여 시도하십시오 :

ofstream os(filename, ios::app); 
+0

'std :: ios_base :: out'은 오픈 모드로 지정되었는지 여부에 관계없이 항상 사용됩니다. 'std :: ios_base :: app'는 내용이 파괴되는 것을 불가능하게합니다. – 0x499602D2

2

당신이 is 처음 읽는 동안 파일의 끝을 명중 할 때, 스트림의 내부 오류 상태에서 eofbit을 설정합니다.

계속 읽기 전에 내부 오류 상태를 재설정하는 is.clear() 함수를 호출하여 초기화해야합니다.

+0

닫기 그러나'eofbit'는 문제를 일으키는 비트가 아니며,'failbit'입니다. 그러나 당신의 대답은 그렇지 않으면 정확합니다. – 0x499602D2

관련 문제