Я занимаюсь разработкой на 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;
Входной файл открывается успешно, а выходной — нет.
Любая помощь в определении, почему выходной файл не открывается для записи, была бы очень признательна.
Очевидная проблема заключается в том, что вы, вероятно, хотели открыть файл, используя 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
добавлено для создания файла, если его нет).
Объявите выходной файл как ofstream
а не ifstream
,
Вы также можете использовать fstream
для входных и выходных файлов.