QTextStream文本流类的功能界面和标准的C++的iostream类非常相似。
iostream和QTextStream的不同点是我们的流操作在一个很容易被继承的QIODevice上,而iostream只能操作一个不能被继承的FILE *指针。
我常常实用QTextStream按照自定义格式保存一些数据到文件中,然后根据需要将保存在的数据读取,处理。使用起来比较方便。
注意:有很多同学提到“保存的数据使用\n不能够换行”,原因之一(可能存在其他原因)在于:打开文件的的方式不对。使用“记事本”不可,尝试使用“写字板”打开文件。
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDir>
#include <QTextStream>
#include <QDebug>
#include <QFileInfo>
#include <QTextCodec>
#include <stdlib.h>
#include <stdio.h>
void writeInfo(const QString dirPath, QTextStream &cin);
void readInfo(QTextStream &cout);
static int File_Dir_Num;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTextCodec *codec = QTextCodec::codecForLocale();
QTextCodec::setCodecForCStrings(codec);
//-------------------------------------------
//使用QTextStream写文件
QFile file("G:/info.txt");
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
qDebug()<<"文件打开失败:"<<file.errorString();
return -1;
}
//获取一些信息将并将它保存到文件info.txt中:以获取指定文件下文件信息为例
QTextStream cin(&file);
//调用文件写入函数,遍历目录将文件信息写入文件
writeInfo("F:\\Warcraft III",cin);
file.close();
//-------------------------------------------
//使用QTextStream读文件(对刚才的文件进行处理)
QFile file2("G:/info.txt");
if(!file2.open(QIODevice::ReadOnly))
{
qDebug() <<"-----------";
qDebug()<<"文件打开失败:"<<file2.errorString();
return -1;
}
QTextStream cout(&file2);
//调用文件读取函数
readInfo(cout);
file2.close();
//---------------------------------------------
//使用FILE结构体指针构造
FILE * fd = fopen("G:/info.txt","r");
if(fd == NULL)
perror("文件打开失败"),exit(-1);
QTextStream out(fd);
qDebug()<<out.readAll(); //输出读取的全部内容
//----------------------------------------------
//对字符串进行操作
QString str;
QTextStream st(&str);
st<<"zhong" <<" "<<"ke"<<" "<<"yuan"<<"\n";
st<<"ruan" <<" "<<"jian"<<" "<<"yuan"<<"\n";
qDebug() << st.readAll();
//将偏移量移动到文件头位置,重新读取字符串
if(st.seek(0))
qDebug() << st.readAll();
//----------------------------------------------
return a.exec();
}
//将目录信息写入文件
void writeInfo(const QString dirPath,QTextStream &cin)
{
QDir dir(dirPath);
foreach(QFileInfo fileInfor,dir.entryInfoList())
{
//排除自己和上一级目录
if(fileInfor.fileName().startsWith("."))
{
continue;
}
//如果是文件
if(fileInfor.isFile())
{
cin << ++File_Dir_Num <<"|"<< fileInfor.fileName()<<"|"<<"F"<<"|"<<fileInfor.size()<<"\n";
}
//如果是目录
else if(fileInfor.isDir())
{
cin << ++File_Dir_Num <<"|"<< fileInfor.fileName()<<"|"<<"D"<<"|"<<fileInfor.size()<<"\n";
writeInfo(fileInfor.filePath(),cin);
}
}
}
//读文件中的内容
void readInfo(QTextStream &cout)
{
while(!cout.atEnd())
{
QStringList strList = cout.readLine().split("|");
qDebug() << QString("文件序号:%1 ").arg(strList.at(0)) << QString("文件名:%1 ").arg(strList.at(1))
<<QString("文件类型:%1 ").arg(strList.at(2) == "F"?"普通文件":"文件夹")<<QString("文件大小:%1").arg(strList.at(3));
}
}