Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中使用文件_C++_Qt_File_File Io - Fatal编程技术网

C++ 在Qt中使用文件

C++ 在Qt中使用文件,c++,qt,file,file-io,C++,Qt,File,File Io,假设我在一个文件中写入一些信息,它以n周期写入,例如: a,a,a,a, b,b,b,b, c,c,c,c, a,a,a,a, b,b,b,b, c,c,c,c, ....... a,a,a,a, b,b,b,b, c,c,c,c, 现在我想打开文件检查第一行,找到它重复的地方,然后删除所有内容。在我的例子中,假设我想在a,a,a,a,再次相遇的地方结束,然后删除它,以及之后的所有内容,取而代之的是以下内容: a,a,a,a, b,b,b,b, c,c,c,c, 问:我该怎么做呢?您想删除文

假设我在一个文件中写入一些信息,它以
n
周期写入,例如:

a,a,a,a,
b,b,b,b,
c,c,c,c,
a,a,a,a,
b,b,b,b,
c,c,c,c,
.......
a,a,a,a,
b,b,b,b,
c,c,c,c,
现在我想打开文件检查第一行,找到它重复的地方,然后删除所有内容。在我的例子中,假设我想在
a,a,a,a,
再次相遇的地方结束,然后删除它,以及之后的所有内容,取而代之的是以下内容:

a,a,a,a,
b,b,b,b,
c,c,c,c,

问:我该怎么做呢?

您想删除文件中的重复行。如果你按照下面的步骤去做,你会得到你想要的

  • 创建一个将存储唯一行散列的向量(
    QVector
    ),注意使用
    QMap
    会更快
  • 创建输出文件
  • 计算文件中每一行的哈希值。使用或(在这种情况下,向量应为
    uints
    )。
    • 如果计算的哈希包含在向量中,请跳过此行
    • 否则,将哈希添加到向量,并将该行打印到输出文件
  • 最后,输出文件应仅包含输入文件的唯一实例

您可以使用QTextStream来流式传输您的文件(因此,不必关心RAM)。 然后使用readLine()函数一次读取QString的一行,并与新行进行比较。 下面是一些代码示例:

int lineCounter = 0; //count for line
QFile f(filePath);
if (!f.open(QIODevice::ReadOnly | QIODevice::Text))
    return false;
QTextStream stream(&f);
QString line;
// read the first line
line = stream.readLine();
lineCounter++;
QString hash = QString(QCryptographicHash::hash(line.toAscii(), QCryptographicHash::Md5).toHex());
do
{
    line = stream.readLine();
    if (QString(QCryptographicHash::hash(line.toAscii(), QCryptographicHash::Md5).toHex()).compare(hash) == 0)
    {
        // Save data from 1st line to "lineCounter" to new file, or do your own works;
        // and then break;
    }
    lineCounter++;
} while (!line.isNull());

@Angew我不知道如何直接在文件中完成。看一下。首先浏览
QFile
docs,阅读你发现的所有相关内容。然后将问题细化为更具体一点……嗨,谢谢你的回答。这实际上不适合我,因为周期数可能非常大,我不想继续RAM中的信息太多了。我想直接在文件中执行所有操作。@Mike创建了一个临时文件。无法在文件的中间插入或删除。不确定是否需要,但听起来很像。