【问题标题】:rewrite file content on button click in qt在qt中单击按钮时重写文件内容
【发布时间】:2016-10-16 18:18:23
【问题描述】:

使用基于 Qt 5.2.0(MSVC 2010, 32bit) 的 QtCreator 3.0.0。 我正在尝试构建一个简单的文件处理应用程序;基本上:
1- 用户按下按钮 -> 弹出对话框。
2- 用户选择带有纯文本内容的文件(.txt)。
3-应用程序处理文件并在其中创建包含许多文件(.txt)的文件夹,在所选文件所在的同一文件夹中。

到目前为止,好的;现在,如果用户(不重新启动应用程序)重新执行前 3 个步骤,则该过程会重复,但这次输出有一个缺陷:创建的文件夹中的结果文件将其内容加倍,如将新内容附加到一个已经存在的,而不是删除/清空,然后根据需要用新内容重新创建/重新填充自己。

我尝试使用以下命令删除和/或清空文件:

//code fragment

input = new fstream();
output = new fstream();
address = dialog->selectedFiles().first();
input->open(address.toLatin1(), ios_base::in | ios_base::binary);
QString results_folder_name = "RESULTS";

int lastSlash = address.lastIndexOf("/");
results = new QDir(address.left(lastSlash));
if(results->exists(results_folder_name)){
    results->cd(results_folder_name);
    results->setNameFilters(QStringList() << "*.*");
    results->setFilter(QDir::Files);
    foreach(QString dirFile, results->entryList()){
        results->remove(dirFile);
    }
}else{
    results->mkdir(results_folder_name);
    results->cd(results_folder_name);
}

然后有一个 WHILE 循环用于创建和填充每个结果文件, 我为每个变量使用相同的变量output(不知道该怎么做)然后我 output.close();delete output; 在循环结束之前

任何解决方法都可以,谢谢

编辑:
实际上有两个 while 循环我没有包括在内,第一个(我认为没有必要包括在内)是用于迭代 input 变量并存储变量 extensions 中的信息/字符串,after 是我迭代该变量的实际 while 循环并分发结果文件中的内容,如下所示:

QMap<QString, QStringList>::const_iterator i = extensions.constBegin();  
while(i != extensions.constEnd()){
   QString newExtensionPath = results.absolutePath() + '/' + i.key() + ".txt";
   output.open(newExtensionPath.toLatin1(), ios_base::out | ios_base::binary | ios_base::trunc);
   if(output.is_open()){
      QStringList value = i.value();
      while(!value.empty()){
         QString first = value.takeFirst();
         output.write(first.toLatin1(), first.size());
         output.write("\n", 1);
      }
   } else{msg.setText("error");msg.exec();}
   output.close();
   i++;
}
delete output;

现在,请记住,这段代码不会引发错误或类似的事情,如果我想要的是将内容附加到每个文件而不是重写(这是我真正需要的),它会像一个魅力一样工作.

而且,非常重要:
1-如果我在不重新启动应用程序的情况下继续重复该过程(关闭应用程序窗口并在 Qt 上再次按 Ctrl+R)文件确实会被删除(我每次都检查它们)但是当再次创建时,内容会增加一倍,三倍,翻两番等。
2-如果我重新启动应用程序,每次它第一次运行算法时它都可以正常工作。

如果太乱,请告诉我,以便我解释得更好。

感谢

【问题讨论】:

    标签: c++ qt file


    【解决方案1】:

    使用trunc模式让输出流覆盖现有文件的内容:

    output->open("TargetFileToWrite.bin", ios_base::out | ios_base::binary | ios_base::trunc);
    

    在这种模式下,文件的内容将在流打开时被丢弃。如果同时指定了 ios_base::trunc | ios_base::appopen 方法将失败。

    更新:

    看起来您的extensions 映射在您完成输出到文件后没有被清理。内容保留在那里,当算法重新启动时,它会增加一倍、三倍等。在while 循环之后添加extensions.clear()

    【讨论】:

    • 我添加ios_base::trunc 然后output-&gt;is_open() 返回false,从而在整个过程开始之前就结束了
    • @J.M.Echevarría 看起来您还指定了ios_base::app(附加)标志。您应该删除它以使用ios_base::trunc
    • 我真的不知道,我所拥有的就是我发布的内容,抱歉回复延迟。我真的被困在这里,你碰巧有不同的方法来解决这个问题吗?thanx
    • @J.M.Echevarría 我有更多想法。更新了答案,请查收。
    • 做了最后两个,什么都没有。谢谢你的努力,虽然
    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多