вход и выход в несуществующем файле - PullRequest
9 голосов
/ 24 мая 2010

Можно ли открыть fstream для файла, который не существует с обоими ios :: in & ios :: out, без получения ошибки?

Ответы [ 4 ]

9 голосов
/ 24 мая 2010

Чтобы открыть fstream в файле, который не существует для ввода и вывода (произвольный доступ) без получения ошибки, вы должны предоставить flags fstream::in | fstream::out | fstream::trunc в вызове open (или конструктор ). Поскольку файл еще не существует, усечение файла с нулевыми байтами - не драма.

Вы можете захотеть ошибку при открытии файла, который не существует при указании only ios::in, поскольку вы никогда не сможете читать из потока, поэтому сбой рано в этом случае будут предотвращены неожиданные сбои позже.

1 голос
/ 24 мая 2010
#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 .

0 голосов
/ 22 ноября 2011
std::fstream f("test.txt", std::ios_base::out);
f.close(); //file now exists always
f.open("test.txt", fstream::in | std::ios_base::out);
//f is open for read and write without error

Я не проверил, чтобы он открывался без ошибок, но я уверен, что должен.

0 голосов
/ 24 мая 2010
#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», если он не завершится. Таким образом, невозможно открыть и отправить файл, который не существует, без получения ошибки.

...