ifstream没有为输出创建和打开文件

时间:2012-09-23 20:57:15

标签: c++ netbeans-6.9 ubuntu-11.04 ifstream

我在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;

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

任何有助于确定输出文件未打开以进行写入的帮助都将非常受欢迎。

2 个答案:

答案 0 :(得分:4)

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

您还可以对输入和输出文件使用fstream

答案 1 :(得分:3)

显而易见的问题是,您可能打算使用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::truncstd::ios_base::out | std::ios_base::app

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

但我个人的猜测是,你最好只使用std::ofstream,或者,如果你想打开文件进行阅读和写作std::fstream(但是,这也需要添加std::ios_base::truncstd::ios_base::app以创建文件(如果不存在)。