ifstream не создает и не открывает файл для вывода

Я разрабатываю на С++, используя NetBeans 6.9 на Ubuntu 11.04. Таким образом, я объявил строки имен входных и выходных файлов и файловые потоки

ifstream    fpInputFile, fpOutputFile;
string  inputFileName="", outputFileName="";

Имя входного файла назначается имени существующего файла в качестве входного аргумента для приложения. Имя выходного файла дается так же, как и входное имя, за исключением того, что «_output» вставляется перед последней точкой. Таким образом, вывод записывается в тот же каталог, что и ввод. Также я запускаю netbeans с

su netbeans

поэтому IDE имеет привилегии root для каталога. Пробую открывать файлы, и проверяю открываются ли они таким образом.

fpInputFile.open(inputFileName.c_str(), ifstream::in);
fpOutputFile.open(outputFileName.c_str(), ifstream::out);
if (!(fpInputFile.is_open())) throw ERROR_OPENING_FILE;
if (!(fpOutputFile.is_open())) throw ERROR_OPENING_FILE;

Входной файл открывается успешно, а выходной — нет.

Будем очень признательны за любую помощь в определении того, почему выходной файл не открывается для записи.


person OtagoHarbour    schedule 23.09.2012    source источник
comment
Вы знаете, что i в ifstream означает ввод, да?   -  person paxdiablo    schedule 24.09.2012
comment
Ах! В этом была проблема. Я не понял, что i означает ввод. Я заменил его на o, и это решило проблему. Спасибо большое!   -  person OtagoHarbour    schedule 24.09.2012


Ответы (2)


Очевидная проблема заключается в том, что вы, вероятно, хотели открыть файл, используя std::ofstream, а не std::ifstream. Это помогает на самом деле записывать в поток, хотя есть способы записи в std::ifstream, пока он открыт для чтения. Например, вы можете использовать интерфейс std::streambuf напрямую или использовать std::streambuf для построения и std::ostream.

Более интересный вопрос: почему файл не открывается для записи, когда std::ios_base::in | std::ios_base::out используется для режима открытия? std::ifstream автоматически добавляет std::ios_base::in. Получается, что режим std::ios_base::in | std::ios_base::out не создает файл, но успешно открывает существующий файл. Если вы действительно хотите использовать std::ifstream для открытия файла для вывода, который потенциально не существует, вам нужно будет использовать либо std::ios_base::out | std::ios_base::trunc, либо std::ios_base::out | std::ios_base::app:

  • первый заставит файл быть созданным или усеченным, если он существует
  • последний заставит записи добавляться в файл во всех случаях

Мое личное предположение, однако, заключается в том, что вам лучше просто использовать std::ofstream или, если вы хотите открыть файл как для чтения, так и для записи, std::fstream (что, однако, также потребует добавления std::ios_base::trunc или std::ios_base::app для создания файла, если нет существуют).

person Dietmar Kühl    schedule 23.09.2012

Объявите выходной файл как ofstream, а не ifstream.

Вы также можете использовать fstream как для входных, так и для выходных файлов.

person Andrew Stein    schedule 23.09.2012
comment
Спасибо большое. Замена i на o решила проблему. Спасибо еще раз. - person OtagoHarbour; 24.09.2012