Linux中的qt编程如何分行提取txt文档中的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中的qt编程如何分行提取txt文档中的数据相关的知识,希望对你有一定的参考价值。

提取txt文档中的数据编程如下,只不过这个是每行都提取,我想提取指定行的数据,部分程序如下:
....
while(stream.atEnd()==0)


rowdata=stream.readLine();
data1=rowdata.mid(54,16);
.....

上面的程序把每一行的54列后面的16位数据都提取出来了,我想指定一行提取,比如第3行,那该怎么编程呢,求助高手~
我用的是Linux系统的Fedora14

QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
while (!in.atEnd())
QString line = in.readLine();
process_line(line);


如果要指定某行 加个if判断就行了追问

额,我是菜鸟,可以加点解释吗,比如in.txt是要打开的txt文件,我要打开第2行,是让line变成2吗

追答

line是不能变成2的 我的意思是你要读第二行的话 就在行数为2的时候处理 就是说不管你处理哪一行 要把文件从头遍历 直到你所在的行。
QTextStream in(&file);
int flag = 1; //作为判断的标志
while (!in.atEnd())
QString line = in.readLine();
flag++;
if(flag == 2)
"处理进程";

参考技术A 自己计算行数, 不要的丢弃

如何从 Qt 中的 txt 文件中删除一行?

【中文标题】如何从 Qt 中的 txt 文件中删除一行?【英文标题】:How to delete a line from a txt file in Qt? 【发布时间】:2021-11-07 21:51:00 【问题描述】:

我的 txt 文件 (CopyBook.txt) 包含例如 10 行。我想删除第三个。

我有这个代码:

QString fname = "C://Users//Tomahawk//Desktop//copy//CopyBook.txt";
QFile file(fname);

if (file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))

    QTextStream edit(&file);
    QString line;

    int reachForLine = 0;
    int neededLine = 3;

    while (reachForPage != pageCounter)
    
        line = edit.readLine();
        reachForPage++;
    

所以你可以看到我使用“while”来获取我想要删除的行。但我还没有在 Qt 中找到任何允许我这样做的方法。将来我想使用删除行的能力将它们替换为其他行。那么如何删除呢?

【问题讨论】:

通常最好将您要保留的所有行复制到一个临时文件(与原始文件在同一目录中),然后将临时文件重命名为原始文件名。另一种选择是将该行标记为已删除,并在以后读取文件时跳过它。 【参考方案1】:

一种方法是将所有行读入QStringList,修改QStringList,然后转身将其内容再次写回文件,如下所示:

int main(int argc, char ** argv)

   const QString fname = "C:/Users/Tomahawk/Desktop/copy/CopyBook.txt";
   QStringList lines;

   // Read lines of text from the file into the QStringList
   
      QFile inputFile(fname);
      if (inputFile.open(QIODevice::ReadOnly | QIODevice::Text))
      
         QTextStream edit(&inputFile);
         while (!edit.atEnd()) lines.push_back(edit.readLine());
      
      inputFile.close();
   

   // Delete the third line from the QStringList
   if (lines.length() > 2) lines.removeAt(2);  // 0==first line, 1==second line, etc

   // Write the text in the QStringList back to the file
   
      QFile outputFile(fname);
      if (outputFile.open(QIODevice::WriteOnly | QIODevice::Text))
      
         QTextStream edit(&outputFile);
         for (int i=0; i<lines.size(); i++) edit << lines[i] << Qt::endl;
      
      outputFile.close();
   

   return 0;

您还可以在将 QStringList 对象写回文件之前对其执行任何替换/插入操作。

请注意,这种方法确实会占用与文件大小成正比的 RAM,因此对于非常大的文件(例如千兆字节长),您可能希望使用 create-a-second-file-and-then-rename 方法而是由@TedLyngmo 在他的评论中提出。对于小文件,OTOH,在 RAM 中缓冲更容易且不易出错。

【讨论】:

太棒了,兄弟,正是我需要的,谢谢!

以上是关于Linux中的qt编程如何分行提取txt文档中的数据的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 如何计算 .txt 文件中的行数

Qt::如何识别/检测系统是不是被Linux中的其他系统远程访问

【现学现忘&Shell编程】— 30.cut列提取命令

编写linux脚本根据文档中的内容(文件名)查找文件

QT多线程问题:子线程中的变量如何传递给主线程?

android应用程序编程中如何获取遍历手机sd卡和系统目录获得.txt文档显示到ListView中?