파일에 여러 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;
}
함수 내부의'ostream'은'main()'에있는 것보다 먼저 파괴되므로 먼저 버퍼를 플러시합니다. – cantordust
@cantordust 흥미 롭 군, 그걸 인용 해 주시겠습니까? – Miket25
당신은'close()'를 명시 적으로 호출하기 때문에 기술적으로 스트림이 파괴되기 전에 버퍼가 플러시되지만 소멸자가 어쨌든'close() '를 호출 할 것이기 때문에 이것은 부적절합니다. [here] (http://en.cppreference.com/w/cpp/io/basic_filebuf/close)를 참조하십시오 :'[...] 먼저 오버 플로우 (Traits :: eof())를 호출하여 보류중인 모든 출력을 파일 [...]'. 'main()'에서'writeTo ("foo.txt");를 호출하기 전에'o.close()'**를 호출하면'First' 뒤에'Second'가옵니다. – cantordust