1

我在 Ubuntu 11.04 上使用 NetBeans 6.9 在 C++ 中进行开发。我已经声明了输入和输出文件名字符串和文件流

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;

输入文件成功打开,但输出文件没有。

任何帮助确定为什么输出文件没有打开以供写入将不胜感激。

4

2 回答 2

4

将输出文件声明为一个ofstream而不是一个ifstream.

您还可以将 afstream用于输入和输出文件。

于 2012-09-23T21:00:57.680 回答
3

明显的问题是您可能打算使用 astd::ofstream而不是std::ifstream. 这有助于实际写入流,尽管std::ifstream只要打开以供读取,就有办法写入。例如,您可以std::streambuf直接使用接口或使用std::streambuf来构造 and std::ostream

更有趣的问题是:为什么在std::ios_base::in | std::ios_base::out使用打开模式时文件没有打开写入?std::ifstream自动添加std::ios_base::in. 事实证明,该模式std::ios_base::in | std::ios_base::out不会创建文件,但会成功打开现有文件。如果您真的想使用 anstd::ifstream打开可能不存在的输出文件,则需要使用std::ios_base::out | std::ios_base::truncor std::ios_base::out | std::ios_base::app

  • 前者将强制创建或截断文件(如果存在)
  • 后者将在所有情况下强制写入附加到文件

但是,我个人的猜测是,您最好只使用std::ofstream,或者,如果您想打开文件以进行读取和写入std::fstream(但是,如果不存在文件,则还需要拥有std::ios_base::truncstd::ios_base::app添加文件来创建文件)。

于 2012-09-23T21:26:22.353 回答