2010-06-24 6 views
7

나는 다음과 같은 코드가 수세 10.1에서 실행/G ++ 4.1.0가, 그리고 그것을 파일에 기록하지 않습니다 있습니다ofstream가 플러시하지 않습니다

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world"; 
} 

파일이 제대로 생성 및 개방 되나 비었다. 나는에 코드를 변경하는 경우 :

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world\n"; 
} 

을 (텍스트에 \n 추가), 그것을 작동합니다. ofstream도 플러시하려고했지만 작동하지 않았습니다.

제안 사항?

+2

결과 파일을 어떻게 확인합니까? – log0

+1

g ++ 4.4.4가있는 Debian/Sid의 프로그램이 예상대로 작동하고 file.out에 줄 바꿈없이 새 문자열이 들어 있습니다. 컴파일러 나 OS를 업데이트 해보십시오 - 두 버전 모두 구형입니다. – Dummy00001

+1

파일이 비어 있는지 어떻게 확인하나요?결과 파일 wc 에 대해 수행하고 출력 내용을 확인하십시오. 그것은 0 2 11. 0 라인, 2 단어, 11 문자이어야합니다. 개행 문자가 없으면 출력 "Hello world"가 프롬프트로 실행되어 누락 될 수 있습니다. –

답변

7

cat을 수행하는 파일을 검사하는 경우 잘못 구성된 셸 일 수 있으며 줄 끝이 없으면 줄을 인쇄하지 못합니다.
std::endl\n 플러시를 추가합니다.

+3

그래,'cat file; 에코 '. 어쨌든'endl'을 사용하지 마십시오. 나는 그 어리석은 구조를 사용하는 코드가 싫어 표준을 사람들이 표준에서 제거하기를 바란다. 플러싱은 비용이 많이 들고, 항상 의식적으로 그리고 미리 생각해야합니다. – Omnifarious

+0

문제는 끝에 '\ n'이 없으면 행을 표시하지 않는 버그가있는 편집기였습니다. 분명히, vi는 올바르게 보여줍니다. 감사합니다. –

0

file << "Hello world" << std::endl; 

사용할 수 있습니까?

endl은 개행을 삽입하고 버퍼를 플러시합니다. 이미 플러싱을 시도했다고 말했을 때 당신이 말하는 것은 무엇입니까? 이 경우

4

당신이 시도 모르겠어요하지만 당신은 수행해야합니다

file << "Hello World" << std::flush; 

업데이트을; 나는 때문에 의견을 바탕으로 유용한 의견

의 여기이 대답을 떠날거야, 내 조언을 수정할 수 있습니다 : 소멸자 않기 때문에 당신은 명시 적으로 (그 문제 또는 file.close()) std::flush를 호출 할 필요가 없습니다 너를 위해서.

또한 flush를 호출하면 명시 적으로 가장 최적화 된 방법이 아닌 I/O 작업이 수행됩니다. 기본 iostream 및 운영 체제를 연기하는 것이 더 좋을 것입니다.

분명히 OP의 문제는 std::flush을 호출하는 것과 관련이 없으며 파일 스트림 소멸자가 호출되기 전에 해당 파일을 읽으려고 시도했을 가능성이 큽니다.

+2

'ofstream' 소멸자가 자동으로 플러시됩니다. – Omnifarious

+0

@Omnifarious : 그게 downvote받을 자격이 있니? 내 대답은 틀렸어 *? –

+1

@ 존 웰던 (John Weldon) - 영업 담당자가 실제 문제를 다루지 않기 때문에 잘못되었습니다. 디버깅과 실제 문제가 무엇인지 알아내는 데 유용 할 수 있지만 (그 이유는 주석이어야 함) 자체 솔루션은 아닙니다. 솔루션이라면 그 이유가 무엇인지 이해하지 않고 코드를 삽입하는 카고 스타일 솔루션을 제안합니다. – Omnifarious

4

소멸자는 파일을 플러시하고 닫아야합니다. 나는 확신

이 오류가 다른 장소 중 하나

1) 당신은 시간의 적절한 지점에서 확인하지 않습니다. 어느 시점에서 파일의 내용을 "후"에서 끝내는 지 비교하거나 프로그램이 끝나기 전에 중단 점을 설정하고 파일 내용을 확인합니까?

2) 어떻게 든 프로그램이 종료되기 전에 충돌이 발생합니까?

+0

예, 주어진 프로그램이 실행되고 완전히 끝난 후 프롬프트가 다시 나타나면 데이터가 포함되지 않습니다. 어딘가에 버그가 있습니다. – Omnifarious

관련 문제