fstream没有用C ++创建文件

时间:2015-03-03 14:00:12

标签: c++ file-io fstream

我在SO上检查了几个这样的问题: Link 1Link 2

但他们的答案都没有帮助我。花了这么多时间进行调试后,我无法检测到这个bug。 所以,我再次在这里问它。

我的程序代码是:

#include<iostream>
#include<fstream>
#include<string.h>

using namespace std;

int main(){
    ofstream file;
    file.open("data.dat",fstream::out);
    file<<fflush;
    if(!file)
        cout<<"error"<<strerror(errorno);
    file.close();
    return 0;
}

这是处理文件处理的程序的主干。该程序的其余部分处理一些数据并将其写入文件,我认为该文件既不相关也不影响文件处理。

有趣的是程序没有闪烁任何错误。

4 个答案:

答案 0 :(得分:4)

您的代码通常适用于较小的更改,文件只是在运行程序的当前工作目录中创建,而不是在可执行文件所在的目录中创建。您可能还需要解决许多其他问题。 :

#include <iostream>
#include <fstream>
// if including things from the C standard library in a C++ program,
// use c[header] instead of [header].h; you don't need any here though.

using namespace std;

int main()
{
    // no need to call open(), the constructor is overloaded
    // to directly open a file so this does the same thing
    ofstream file("data.dat");

    if(!file)
    {
        cout << "Couldn't open file" << endl;
        return 1;
    }

    file.close();

    // return 0; is not needed, your program will automatically
    // do this when there is no return statement
}

有关打开文件无效的详细信息,您可以查看std::basic_ios::bad()std::basic_ios::fail()。使用C ++流进行文件处理时,无需检查errno

答案 1 :(得分:0)

int main(){
    ofstream file;
    file.open("data.dat") // no need to call for ofstream ->fstream::out
    // file<<fflush; fflush won't work since there is nothing unwriten
    if(!file.is_open()) // use is_open();
        cout<<"error"<<strerror(errorno);
    // write something to file
    file << " ";
    file.close();
    return 0;
}

答案 2 :(得分:0)

如果文件已打开,则可以在GDBprocfs的帮助下找到其位置。只需在文件打开且尚未关闭的地方放置一个断点即可。在调试器上运行程序,直到触发断点。然后使用以下命令:

ls -l /proc/<pid>/fd

其中<pid>是程序的PID。文件的完整路径应在输出中的某个位置。

答案 3 :(得分:-1)

#include <iostream>
#include <fstream>
#include <string.h>
#include <errno.h>

int main (int argc, char* argv[])
{
        std::ofstream file;
        file.open("data.dat", std::fstream::out);
        file << "Hello" << std::endl;

        if (!file)
                std::cout << "error" << strerror(errno);
        file.close();
        return 0;
}

主要差异:

  • 您没有#include <errno.h>.
  • 您将“errorno”传递给strerror(),而不是“errno”,这是正确的数字。

这适用于Ubuntu 14.04(64位)。我使用没有标志的g ++编译。

另外,我建议您不要使用使用命名空间std; 一旦开始与其他库集成,例如Boost(Boost的库可能与每个C ++标准库重叠),这可能会非常烦人特征)。