gpt4 book ai didi

c++ - 在qt中单击按钮重写文件内容

转载 作者:行者123 更新时间:2023-11-28 05:28:18 25 4
gpt4 key购买 nike

使用基于 Qt 5.2.0(MSVC 2010,32 位)的 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();删除输出;在循环结束之前

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

编辑:
实际上有两个 while 循环我没有包含,第一个(我认为没有必要包含)用于遍历 input 变量并将信息/字符串存储在变量 extensions 中,之后是实际的 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- 如果我重新启动应用程序,每次它第一次运行算法时都可以正常工作。

请告诉我它是否太困惑,以便我更好地解释它。

谢谢

最佳答案

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

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

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

更新:

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

关于c++ - 在qt中单击按钮重写文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40073771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com