如何在c++ / Qt中递归地将数据写入文本文件
How to recursively write data to a text file in C++/ Qt
我有一个c++ Qt程序,它扫描特定目录下的文件。我试图将路径写入文本文件中包含的文件,但我所能做的就是将路径写入最后一个文件。
void ScanDir::qDirIteratorScanner(QString path)
{
QDirIterator it(path, QStringList() << "*.mp4", QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext())
{
WriteToFile writeToFile(path, it.next());
qDebug() << "it.next()";
}
}
…
WriteToFile::WriteToFile(QString path, QString data)
{
path += "/Data.txt";
QFile file(path);
if (file.open(QFile::ReadWrite)) {
QTextStream stream(&file);
stream << data << endl;
}
}
如何将所有路径写入文本文件?
您在每次调用WriteToFile
时都以读写模式创建QFile
:这将截断文件的内容,因此仅保留上次调用写入的内容。
试题:
void ScanDir::qDirIteratorScanner(QString path)
{
QDir dir(path);
QFile file(dir.absoluteFilePath("Data.txt"));
if (file.open(QFile::ReadWrite)) {
QTextStream stream(&file);
QDirIterator it(
dir,
QStringList() << "*.mp4",
QDir::Files,
QDirIterator::Subdirectories
);
while (it.hasNext())
{
stream << it.next() << endl;
}
}
}
这里文件只打开一次。如果您希望/需要保留WriteToFile
函数,则将stream
作为附加参数传递(通过引用)。
注意:
根据Simon Kraemer在评论中提出的建议,我使用QDir::absoluteFilePath
,因为它可以更容易地防止路径中丢失或意外的斜杠。
保留设计的另一种选择可能是使用QFile::Append
模式:
void ScanDir::qDirIteratorScanner(QString path)
{
QDir dir(path);
// reset the file
{
QFile file(dir.absoluteFilePath("Data.txt"));
file.open(QFile::ReadWrite);
}
QDirIterator it(
dir,
QStringList() << "*.mp4",
QDir::Files,
QDirIterator::Subdirectories
);
while (it.hasNext())
{
WriteToFile writeToFile(path, it.next());
qDebug() << "it.next()";
}
}
WriteToFile::WriteToFile(QString path, QString data)
{
QDir dir(path);
QFile file(dir.absoluteFilePath("Data.txt"));
if (file.open(QFile::Append)) {
QTextStream stream(&file);
stream << data << endl;
}
}
每次打开文件并写入一行,覆盖文件中的任何内容。相反,尝试以追加模式打开它,这将导致您写入的内容被添加到文件的末尾。
QTextStream流(和文件,QIODevice::附加),
你必须以"append"模式打开文件,否则你将在每次打开文件时重写它的内容:
file.open(QFile::Append)
2注释:
- 从构造函数写入文件似乎有问题。为什么不直接声明一个函数呢?
你为什么不把文件打开一次呢?
void ScanDir::qDirIteratorScanner(QString path) { QFile file(QDir(path).absoluteFilePath("Data.txt")); if(file.open(QFile::WriteOnly)) { QTextStream stream(&file); QDirIterator it(path, QStringList() << "*.mp4", QDir::Files, QDirIterator::Subdirectories); while (it.hasNext()) { stream << it.next() << endl; qDebug() << "it.next()"; } } }
将文件打开和写入移动到qDirIteratorScanner()
而不是WriteToFile()
将是最有效的。这样你就可以打开文件,写入所有内容,然后关闭文件。
你现在所拥有的是你在每次迭代中打开(和覆盖)同一个文件。这就是为什么你只剩下最后一个字。或者,您可以打开带有QIODevice::Append
标志的文件,但与第一个建议相比,这只是不必要的操作,在第一个建议中,您只需打开文件一次即可写入所有内容。
相关文章:
- C++数据文件、数组和计算赋值
- 数据文件的第二行未正确读取
- 在 C++/C 中使用 CURL 发出带有数据文件的 GET HTTP 请求
- 将数据文件读入结构 C++
- 引入流时C++数据文件未正确读取?
- 如何在数据文件中查找和显示内容
- 如何处理错误"E1696命令行错误:无法在Visual Studio 2017中打开元数据文件"mscorlib.dll"?
- 尝试读取数据文件,存储在数组中并打印所有元素,但它不起作用
- 将数据文件读入对象数组时出现问题
- C :数据文件有错误:预期的无限制ID
- C 和 C++:带有错误"Expected unqualified-id"的数据文件
- 如何在C 中读取一系列数据文件
- 从数据文件中读取每2个字节,并在向量中进行比较
- 写入单个大数据文件或多个小文件:哪个更快?
- 在读取数据文件时,如何找到用户字符串输入的字谜?
- 保护外部数据文件免受未经授权的修改
- C 读取数据文件
- C 如何将数据文件读取到结构或向量以及返回结构或向量
- 具有挑战性的数据文件格式,需要将其读取为包含类对象的数组的VAR
- C 中的Google单元测试:如何编写持久数据文件