2017-11-20 24 views
0

파일에 여러 ostream이 서로 다른 출력 순서를 생성하는 이유는 무엇입니까? 예를 들어 :파일에 여러 개의 ostream이 서로 다른 출력 순서를 생성합니다.

#include <iostream> 
#include <fstream> 
using namespace std; 

void writeTo(string filename){ 
    ostream o; 
    o.open(filename, ios::app); 
    o << "Second\n"; 
    o.close(); 
} 

int main(){ 
    ostream o; 
    o.open("foo.txt", ios::app); 
    o << "First\n"; 
    writeTo("foo.txt"); 
    o.close(); 
    return 0; 
} 

출력 파일은 왜이 경우

Second 
First 

입니까? 처음에는 그 다음에 두 번째가되어서는 안됩니까?

은 내가 하나 개의 스트림을 갖는 등 참조를 전달하여이 동작을 달성 할 수 알지만, 같은 파일에 여러 개의 스트림이 문제의 원인을 혼란 스러워요 :

#include <iostream> 
#include <fstream> 
using namespace std; 

void writeTo(ostream& o){ 
    o << "Second\n"; 
} 

int main(){ 
    ostream o; 
    o.open("foo.txt", ios::app); 
    o << "First\n"; 
    writeTo(o); 
    o.close(); 
    return 0; 
} 
+0

함수 내부의'ostream'은'main()'에있는 것보다 먼저 파괴되므로 먼저 버퍼를 플러시합니다. – cantordust

+0

@cantordust 흥미 롭 군, 그걸 인용 해 주시겠습니까? – Miket25

+1

당신은'close()'를 명시 적으로 호출하기 때문에 기술적으로 스트림이 파괴되기 전에 버퍼가 플러시되지만 소멸자가 어쨌든'close() '를 호출 할 것이기 때문에 이것은 부적절합니다. [here] (http://en.cppreference.com/w/cpp/io/basic_filebuf/close)를 참조하십시오 :'[...] 먼저 오버 플로우 (Traits :: eof())를 호출하여 보류중인 모든 출력을 파일 [...]'. 'main()'에서'writeTo ("foo.txt");를 호출하기 전에'o.close()'**를 호출하면'First' 뒤에'Second'가옵니다. – cantordust

답변

1

그것은에있다가 너 .close() ostreams와 함께 주문하십시오.

먼저 파일을 추가 모드로 열고 'First'를 버퍼링하지만 실제로 파일에 도달하지는 않습니다.

ostream o; 
o.open("foo.txt", ios::app); 
o << "First\n"; 

그런 다음 파일을 다시 열고 '둘째', 파일을 닫은 다음 실제로 파일에 버퍼를 넣습니다.

ostream o; 
o.open(filename, ios::app); 
o << "Second\n"; 
o.close(); 

마지막으로, 당신은 파일에, '먼저'포함 된 첫 번째 ostream에를, 출력, 기본 기능에 o.close();을한다. 이 (모드 추가) ios::app에 오픈 된 이후, 텍스트 당신이 본 것을 생성, 파일의 끝으로 이동 :

Second 
First 

더 읽기 :

파일 열기 모드 : http://www.dummies.com/programming/cpp/open-modes-in-c/

방법 http://www.cplusplus.com/reference/fstream/ofstream/close/

나중에이를 피하려면 다시 열기 전에 파일을 닫거나 다시 쓸 때 처음 쓴 후 파일을 플러시해야합니다. 여기 보이는 : http://www.cplusplus.com/reference/ostream/ostream/flush/

ostream::flush() 버퍼를 파일로 강제 이동합니다.