我在Ubuntu 11.04上使用NetBeans 6.9在C ++中进行开发。我声明了输入和输出文件名字符串和文件流
ifstream fpInputFile, fpOutputFile;
string inputFileName="", outputFileName="";
为输入文件名指定现有文件的名称作为应用程序的输入参数。输出文件名与输入名称相同,但" _output"在最后一期之前插入。因此输出将写入与输入所在的目录相同的目录。我也用
开始netbeanssu 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;
输入文件成功打开,但输出文件没有打开。
任何有助于确定输出文件未打开以进行写入的帮助都将非常受欢迎。
答案 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::trunc
或std::ios_base::out | std::ios_base::app
:
但我个人的猜测是,你最好只使用std::ofstream
,或者,如果你想打开文件进行阅读和写作std::fstream
(但是,这也需要添加std::ios_base::trunc
或std::ios_base::app
以创建文件(如果不存在)。