Когда вы говорите:
fstream file("file.txt", fstream::in | fstream::out | fstream::app);
вы открываете файл в режиме добавления - то есть в конце. Просто откройте его в режиме чтения:
fstream file("file.txt", fstream::in );
или используйте ifstream:
ifstream file("file.txt" );
И, конечно, как предлагает Уорвикер, вы всегда должны проверять, что открытие прошло успешно.
Если вы решили открыть в режиме добавления, вы можете явно переместить указатель чтения:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
fstream file( "afile.txt", ios::in | ios::out | ios::app );
if ( ! file.is_open() ) {
cerr << "open failed" << endl;
return 1;
}
else {
file.seekg( 0, ios::beg ); // move read pointer
string line;
while( getline( file, line ) ) {
cout << line << endl;
}
}
}
Редактировать: Кажется, что сочетание флагов, используемых при открытии файла, приводит к специфическому поведению реализации. Приведенный выше код работает с g ++ в Windows, но не с g ++ в Linux.