Qt编程11: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));
    }
}


 

 

 

 

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值