QT 读取txt 文件

本文详细介绍QT中文件和目录操作的关键类QIODevice、QFile、QDir和QFileInfo的功能和使用方法,包括文件读写、目录遍历及文件信息获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习QT的文件操作

 

1、QIODevice
直接继承自QObject

QIODevice类是输入/输出设备的基类。

QIODevice为设备提供了公共实现和抽象接口用于读写块数据。
QIODevice是一个抽象类,不能被实例化。

被Q3Socket,Q3SocketDevice,QAbstractSocket,QBuffer,QFile,QLocalSocket,QNetworkReply,QProcess继承.


===============================================================================================

 

2、QFile

 

继承自QIODevice

 

QFile类是一个操作文件的输入/输出设备。

QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用,但是如果和QDataStream或QTextStream一起使用将更加方便。

文件名通常可以通过构造函数来传递,但也可以使用setName()来设置。目录分隔符在任何操作系统下都使用“/",“/"不被支持。你可以通过exists()来检查一个文件是否存在并且可以通过remove()来移去一个文件。更多操作系统相关的高级文件系统操作QT提供了QFileInfo和QDir类.

文件可以用open()来打开、用close()来关闭、用flush()来刷新。数据通常可以使用QDataStream或者QTextStream进行读写,但你也可以使用read(),readLine(),readAll(),write()读写。QFile也支持getChar(),putChar(),和ungetChar()

size()可以返回文件的大小。你可以通过使用pos()函数得到当前文件位置或者使用seek()移到一个新的文件位置。如果你到了文件的末尾,atEnd()返回真。

 

一行一行直接读取文件

 

Cpp代码  收藏代码

  1. QFile file("/home/administrator/testdir/test.txt");    
  2. if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {    
  3.     qDebug()<<"Can't open the file!"<<endl;    
  4. }    
  5. while(!file.atEnd()) {    
  6.     QByteArray line = file.readLine();    
  7.     QString str(line);    
  8.     qDebug()<< str;    
  9. }    

 

    使用QTextStream读取文件

 

Cpp代码  收藏代码

  1. QFile file("/proc/modules");  
  2.  if (!file.open(QIODevice::ReadOnly | QIODevice::Text))  
  3.      return;  
  4.   
  5.  QTextStream in(&file);  
  6.  QString line = in.readLine();  
  7.  while (!line.isNull()) {  
  8.      process_line(line);  
  9.      line = in.readLine();  
  10.  }  

 

     使用QTextStream写入文件

 

Cpp代码  收藏代码

  1. QFile file("out.txt");  
  2. if (!file.open(QIODevice::WriteOnly | QIODevice::Text))  
  3.     return;  
  4.   
  5. QTextStream out(&file);  
  6. out << "The magic number is: " << 49 << "\n";  

 

QDataStream 重载了运算符了"<<"写数据,>>读数据

 

Cpp代码  收藏代码

  1.   QFile file("/home/administrator/testdir/test.txt");    
  2.     if(!file.open(QIODevice::ReadWrite | QIODevice::Text)) {    
  3.         qDebug()<<"Can't open the file!"<<endl;    
  4.     }    
  5.     QTextStream stream(&file);    
  6.     QString line_in;    
  7. //    while( !stream.atEnd()){    
  8. //        line_in = stream.readLine();    
  9. //        qDebug() << line_in;    
  10. //    }    
  11. //    stream.seek(stream.pos());    
  12.     stream.seek(file.size());//将当前读取文件指针移动到文件末尾    
  13.     int count = 0;    
  14.     while(count < 10){    
  15.         stream << QObject::trUtf8("新建行:") <<++count<<"/n";    
  16.     }    
  17.     stream.seek(0);//将当前读取文件指针移动到文件开始    
  18.     while( !stream.atEnd()){    
  19.         line_in = stream.readLine();    
  20.         qDebug() << line_in;    
  21.     }    

 

 

 

3、QDir

     QDir类提供了访问目录结构和他们的内容。

     QDir类提供了访问目录结构和它们的内容的与平台无关的方式。 
     QDir用来操作路径名称、关于路径和文件的访问信息和操作底层文件系统。 
     QDir使用相对或绝对文件路径来指向一个文件。绝对路径是从目录分隔符“/”或者带有一个驱动器标识(除了在Unix下)。如果你总是使用“/”作为目录分隔符,Qt将会把你的路径转化为符合底层的操作系统的。相对文件名是由一个目录名称或者文件名开始并且指定一个相对于当前路径的路径。 
例如绝对路径:
     QDir("/home/administrator/soft");
     QDir("D:/software");
     我们可以使用isRelative()或isAbsolute()函数确认QDir是用的相对路径还是绝对路径。使用makeAbsolute()来转换相对路径的QDir转换成绝对路径的QDir.

 

Cpp代码  收藏代码

  1.      QDir d("D:/");    
  2.     d.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks | QDir::AllDirs);//列出文件,列出隐藏文件(在Unix下就是以.开始的为文件),不列出符号链接(不支持符号连接的操作系统会忽略)    
  3.     d.setSorting(QDir::Size | QDir::Reversed);//按文件大小排序,相反的排序顺序    
  4.     const QFileInfoList list = d.entryInfoList();//返回这个目录中所有目录和文件的QFileInfo对象的列表    
  5.     QFileInfoList::const_iterator iterator = list.begin();    
  6.     qDebug() << "目录和文件的数量: " << d.count();//返回找到的目录和文件的数量    
  7.     qDebug() << "fileName/t/t/tsize/t/t/t";    
  8.     while(iterator != list.end()){    
  9.         qDebug() << (*iterator).fileName()<<"/t/t/t"<<(*iterator).size();    
  10.         iterator++;    
  11.     }    
  12.     qDebug() << "当前目录: " << d.current();//返回应用程序当前目录。    
  13.     qDebug() << "当前目录的绝对路径" << d.currentPath();//返回应用程序当前目录的绝对路径。    
  14. //    const QList<QString> list = d.entryList(); //返回这个目录中所有目录和文件的名称的列表    
  15. //    QList<QString>::const_iterator iterator = list.begin();    
  16. //    while(iterator != list.end()){    
  17. //        qDebug() << (*iterator);    
  18. //        iterator++;    
  19. //    }    

 

     运行结果:

     

 

4、QFileInfo

     QFileInfo类提供了一个与平台无关的文件信息.

     QFileInfo提供了关于系统中的文件名称和位置,访问权限和是否是符号链接,文件大小和上次修改/读写时间等,也能被用于Qt资源文件。

     QFileInfo能通过相对/绝对路径指向一个文件。

     可以使用isFile(),isDir(),isSymLink().symLinkTarget()函数提供符号链接的目标文件。

      在Unix(包括Mac OS X)的符号链接具有与目标文件相同的大小(),因为Unix透明地处理符号链接;同样,打开一个符号连接使用的QFile有效地打开链接的目标.

 

    在Windows中,符号链接(快捷方式)的lnk文件。它大小()的是,符号链接(而不是链接的目标)的大小,打开一个符号连接使用的QFile并打开。lnk文件。例如   

 

Cpp代码  收藏代码

  1. #include <QtCore/QCoreApplication>    
  2. #include <QFileInfo>    
  3. #include <QDebug>    
  4.     
  5. int main(int argc, char *argv[])    
  6. {    
  7.     QCoreApplication a(argc, argv);    
  8.     QFileInfo info1("E:/meego/vi_command.lnk");    
  9.     qDebug() << info1.isSymLink();    
  10.     qDebug() << info1.absoluteFilePath();    
  11.     qDebug() << info1.size();    
  12.     qDebug() << info1.symLinkTarget();    
  13.     qDebug() << "**********************";    
  14.     QFileInfo info2(info1.symLinkTarget());    
  15.     qDebug() << info2.isSymLink();    
  16.     qDebug() << info2.absoluteFilePath();    
  17.     qDebug() << info2.size();    
  18.     
  19.     return a.exec();    
  20. }    

 

     运行结果:

     

 

 

[cpp] view plaincopy

  1. #include <QtCore/QCoreApplication>  
  2. #include <QFileInfo>  
  3. #include <QDebug>  
  4. #include <QTextCodec>  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     QCoreApplication a(argc, argv);  
  9.   
  10.     QTextCodec *codec = QTextCodec::codecForName("GB2312");  
  11.     QTextCodec::setCodecForLocale(codec);  
  12.     QTextCodec::setCodecForCStrings(codec);  
  13.     QTextCodec::setCodecForTr(codec);  
  14.   
  15.     QFileInfo info("E:/meego/基本命令与VI.Command.txt");  
  16.     qDebug() << info.baseName();//不包括后缀名  
  17.     qDebug() << info.bundleName();//只有在Mac OS才有用,其它平台为空字符串  
  18.     qDebug() << info.suffix();//后缀名  
  19.     qDebug() << info.completeBaseName();//不包括后缀名  
  20.     qDebug() << info.completeSuffix();//完整的后缀名  
  21.     return a.exec();  
  22. }  

 

     运行结果:

     

<think>好的,我现在需要回答用户关于如何使用Qt在C++中读取TXT文件的问题,并且需要提供示例代码。首先,我应该回忆一下Qt中处理文件读取的相关类和方法。 用户提到的是读取TXT文件,所以应该使用QFile和QTextStream这两个类。QFile用于文件的打开和关闭,而QTextStream可以方便地读取文本内容。记得要包含必要的头文件,比如<QFile>和<QTextStream>。 接下来,我需要考虑示例代码的结构。首先创建一个QFile对象,指定文件路径。然后用QFile::open方法打开文件,这里需要检查是否成功打开,如果失败的话可能需要输出错误信息。成功打开后,使用QTextStream读取内容,可以逐行读取或者一次性读取全部内容。 另外,用户可能需要处理不同的读取方式,比如逐行读取或者一次读取全部,所以在示例代码中应该展示这两种方法。同时,要注意文件的路径是否正确,是否需要使用绝对路径或者相对路径,这里可能需要提醒用户根据实际情况调整路径。 然后,我需要确保代码符合Qt的最佳实践,比如使用QCoreApplication来处理命令行应用,或者QApplication如果涉及GUI。但用户可能只需要一个简单的控制台示例,所以可能不需要涉及GUI部分。 另外,异常处理也很重要,如果文件无法打开,应该给出提示,这样用户知道如何调试。还要注意资源的释放,比如在读取完毕后关闭文件,不过QFile的析构函数会自动处理,显式关闭也是好的习惯。 最后,用户可能需要相关的扩展问题,比如处理大文件、不同编码或者异步读取。所以生成的问题可以包括这些方面,帮助用户进一步学习。 现在,把这些思路整理成步骤清晰的回答,并提供示例代码。确保代码语法正确,注释清楚,用户能够理解每一步的作用。同时,引用相关的Qt文档作为参考,帮助用户查阅更多信息。</think>### 使用Qt读取TXT文件的步骤及示例代码 以下是使用Qt在C++中读取文本文件的标准方法,基于`QFile`和`QTextStream`类实现: #### 1. 包含必要头文件 ```cpp #include <QFile> #include <QTextStream> #include <QDebug> ``` #### 2. 核心实现代码 ```cpp void readTextFile(const QString &filePath) { QFile file(filePath); // 检查文件是否存在及可性 if (!file.exists()) { qWarning() << "File not found:" << filePath; return; } // 打开文件(只模式) if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qWarning() << "Open file failed:" << file.errorString(); return; } QTextStream in(&file); in.setCodec("UTF-8"); // 设置编码格式(根据文件实际编码调整) // 方法1:一次性读取全部内容 QString allContent = in.readAll(); qDebug() << "File content:\n" << allContent; // 方法2:逐行读取(更适合大文件) file.seek(0); // 重置读取位置 while (!in.atEnd()) { QString line = in.readLine(); qDebug() << "Line:" << line; } file.close(); } ``` #### 3. 调用示例 ```cpp int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); readTextFile(":/data/sample.txt"); // 使用资源文件路径 // readTextFile("C:/Users/Desktop/test.txt"); // 绝对路径 return 0; } ``` ### 关键点说明 1. **文件路径处理**: - 使用资源系统路径时以`:/`开头 - 绝对路径直接指定完整路径 - 相对路径相对于程序运行目录 2. **编码处理**: - 通过`setCodec()`指定正确编码(如UTF-8、GBK等) - 使用`QTextCodec::codecForName("UTF-8")`处理特殊编码 3. **错误处理**: - 检查`file.exists()` - 验证`file.open()`返回值 - 使用`file.errorString()`获取错误描述 ### 扩展应用 对于GUI应用程序,可结合`QFileDialog`实现文件选择: ```cpp #include <QFileDialog> void MainWindow::on_openButton_clicked() { QString fileName = QFileDialog::getOpenFileName(this, "Open Text File", QDir::homePath(), "Text Files (*.txt)"); if (!fileName.isEmpty()) { readTextFile(fileName); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值