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

Я занимаюсь разработкой на C ++ с использованием 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;

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

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

1

Решение

Очевидная проблема заключается в том, что вы, вероятно, хотели открыть файл, используя 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 добавлено для создания файла, если его нет).

3

Другие решения

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

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

4

По вопросам рекламы [email protected]