17.QT之QTextStream(二)


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));  
    }  
}  
原创链接:https://blog.csdn.net/jiezhj/article/details/36870013



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值