Это возможный открыть fstream на файле, который не существует с обеими iOS:: в и iOS:: не получая ошибку?
#include <iostream>
#include <fstream>
using namespace std;
int main () {
fstream f("test.txt", fstream::in | fstream::out);
cout << f.fail() << endl;
f << "hello" << endl;
f.close();
return 0;
}
Этот код напечатает 1
и не создаст файл «test.txt», если он не завершится. Таким образом, невозможно открыть файл, который не существует, и выполнить его поток без получения ошибки.
Чтобы открыть fstream
для файла, который не существует для ввода и вывода (произвольный доступ), без получения ошибки, вы должны предоставить флаги fstream :: in | fstream :: out | fstream :: trunc
в вызове open
(или конструктора ). Так как файл еще не существует, усечение файла до нуля байтов не представляет никакой драмы.
Вы можете захотеть получить ошибку при открытии несуществующего файла при указании only ios :: in
, так как вы никогда не сможете читать из stream, поэтому ранний сбой в этом случае предотвратит неожиданные сбои в дальнейшем.
#include <fstream>
ofstream out("test", ios::out);
if(!out)
{
cout << "Error opening file.\n";
return 1;
}
ifstream in("test", ios::in);
if(!in)
{
cout << "Error opening file.\n";
return 1;
}
При возникновении ошибки выводится сообщение и возвращается единица (1). Однако можно скомпилировать и выполнить просто ofstream out("test", ios::out);
и ifstream in("test", ios::in);
без каких-либо ошибок. В любом случае создается файл test.