【问题标题】:C++: Why is ofstream not appending or creating new files?C++:为什么 ofstream 不追加或创建新文件?
【发布时间】:2013-09-19 21:29:20
【问题描述】:

我对 ofstream 有一点问题。我的 main 多次调用某个类,每次都使用不同的参数进行测试

ImageComparison* imco = new ImageComparison(queries[i], j, k, l);

在每个实例中我想要一个格式化输出到一个文件,所以我首先尝试了这个

ofstream ofs;
ofs.open("somepath" + params + ".txt");
ofs << "write results";
ofs.close();

我预计 ofstream 会创建几个文件,由于不同的参数和不同的文件名,并在其中写入一些内容。但它似乎总是覆盖以前的文件并只保存最后一个实例。
之后我尝试一遍又一遍地使用一个文件并添加新行,因为这对我的情况来说是一个更好的解决方案

ofstream ofs;
ofs.open("somename.txt", ofstream::out | ofstream::app);
ofs << "write params";
ofs << "write results in same line";
ofs << endl;
ofs.close();

在这种情况下,它似乎没有添加新行,而是覆盖了前一行,最后我只有最后一个实例的结果。
请赐教,我不知道这里有什么问题。
我感谢任何建议/解决方案 :)
编辑:这是具体案例:
主要:

vector<string> queries = {"apple","banana","book"...};
for(int i=0; i<18; i++) {
    //if(i==1) break;
    for(int j=0; j<3;) {
        //if(j==2) break;
        for(int k=10; k<800;) {
            //if(k==400) break;
            for(int l=50; l<600;) {
                ImageComparison* imco = new ImageComparison(queries[i], j, k, l);
                imco->DoImCo();
                delete imco;
            }
        }
    }
}

ImageComparison.cc:

string bloo = "../ImageData/" + m_object_type + "/" + m_object_type + "metric=" + to_string(m_metric) + ",hessian=" + to_string(m_hessian) + ",words" + to_string(m_number_of_words) + ".txt";
ofstream ofs;
ofs.open(bloo.c_str(), ofstream::out | ofstream::app);
for(int i=0; i<image_names.size(); i++) {
    if(similarity_of_one[i] < similarity_average) {
        ofs << " x";
    }else{
        ofs << " v";
    }
}
ofs << endl;
ofs.close();

EDIT2:忘记了“for”中的参数增加,但我认为这并不重要

【问题讨论】:

  • @jrok:不需要ofstream::in,除非你想保留内容同时不追加。 (例如,您想使用查找和一些写入功能更改文件的现有部分)
  • @MatsPetersson 是的,我一度认为out 暗示trunc 或类似的东西。
  • @Auberotte 你能构造一个最小的完整测试用例吗?
  • @jrok 我有一个小测试用例,现在我只使用 4 个参数集还是我误会了你?
  • @Auberotte 好的,你有一个小测试用例,现在可以在这里发布吗?否则很难提供帮助。

标签: c++ ofstream


【解决方案1】:

您是否尝试仅使用示例代码的这一部分开始一个新项目?它不会为您添加新行吗?

块引用

ofstream ofs;
ofs.open("somename.txt", ofstream::out | ofstream::app);
ofs << "write params";
ofs << "write results in same line";
ofs << endl;
ofs.close();

尝试只使用ofstream::app,它会自动为你创建新文件。坦白说,我看不出上面的代码有什么问题。

(对不起,我从来没有回答过。看起来很蹩脚:()

【讨论】:

  • 我认为如果ofstream::app 我可以多次打开一个文件,而不是创建新文件,或者它真的会创建新文件,在我的情况下会覆盖旧文件吗?
  • 是的,您可以多次打开该文件。第一次不存在时,会创建文件。
  • 好吧,我做了一个新的测试项目,它应该可以正常工作,即使在与我的主要项目类似的情况下,这很奇怪......
【解决方案2】:

终于,我发现了一些东西。好像名字有问题。使用像“../Test.txt”这样的常量名称后它工作正常,但不知道为什么但问题消失了。非常感谢您的所有建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多