59 QT读取和写入文本和数据流

文本流和二进制流简介:

https://blog.csdn.net/qq_40732350/article/details/86775579

文本流(QTextStream)

QTextStream类提供了一个方便的接口来读/写文本,可以在QIODevice、QByteArray和QString上进行操作。使用QTextStream的流操作符,可以方便地读/写单词、行和数字。对于生成文本,QTextStream对字段填充、对齐和数字格式提供了格式选项支持。例如:

QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate)) {
    QTextStream out(&data);
    // 写入 "Result: 3.14      2.7       "
    out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
}

在内部,QTextStream使用了一个基于Unicode的缓冲区,QTextStream使用QTextCodec来自动支持不同的字符集。默认的,使用QTextCodec::codecForLocale()返回的编码来进行读写,也可以使用setCodec()函数来设置编码。

使用QTextStream来读取文本文件一般使用三种方式:

  • 调用readLine()或者readAll()进行一块接着一块的读取;
  • 一个单词接着一个单词。QTextStream支持流入到QString、QByteArray和char*缓冲区,单词由空格分开,而且可以自动跳过前导空格;
  • 一个字符接着一个字符,使用QChar或者char类型的流。这种方式经常在解析文件、使用独立的字符编码和行结束语义时用于方便输入处理。可以通过调用skipWhiteSpace()来跳过空格。
     //写入文本
    QFile data("Output.txt");
    if (data. open(QFile::WriteOnly|QFile::Truncate))
    {
        QTextStream out (&data) ;
        //写人” Result, 3.14 2. 7
        out <<"Result:"<< qSetFieldWidth(10)<< left<< 3.14 << 2.7;
        out <<"\nline two";
    }
    data.close();
   //读取文本

    QFile file("Output.txt");
    if(! file.open(QIODevice::ReadOnly|QIODevice::Text))
        return;
    QTextStream in(&file);
    qDebug()<<""<<"Output.txt:";
    while(!in.atEnd())
    {
        // 下面可以对读取的一行字符串进行处理
        QString line = in.readLine();
        qDebug()<<line<<"\n";

    }
    //文件指针归零后,一次读取
    in.seek(0);
    QString lineALL=in.readAll();
    qDebug()<<"Output.txt:"<<lineALL;
    file.close();

二进制流(QDataStream)

Qt中的QDataStream类为我们的程序提供了读写二进制数据流的能力。一个数据流如果是二进制编码的数据流,那么它肯定是与计算机的操作系统、CPU或者字节序无关的。例如,一个数据流是在一个运行Windows系统的PC机上被写入的,那么它照样可以在一台运行linux的机器上被读取出来。同样,我们也可以使用QDataStream去读写原生的未编码的二进制数据。

QDataStream类实现了序列化C++的基本数据类型的功能,比如char,short,int,char* 等等。如果要序列化更复杂的数据类型,可以将复杂数据类型分解成独立的基本数据类型分别进行序列化。

写入到数据流中的每一个条目都是使用一个预定义的格式写人的,这个格式依赖于条目的类型。支持的Qt 类型包括QBrush 、QColor 、QDateTime 、QFont 、QPixmap 、QString 、QVariant 和很多其他格式。

    //将二进制数据写入到数据流中
    QFile file("file.dat");
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);   // we will serialize the data into the file 串行化数据
    out << QString("the answer is");   // serialize a string 串行化字符串
    out << (qint32)42;        // serialize an integer 串行化数组
    file.close();
    //从数据流中读取二进制数据
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);    // read the data serialized from the file 从文件读取串行化数据
    QString str;
    qint32 a;
    in >> str >> a;           // extract "the answer is" and 42 提取两个数据
    qDebug()<<"str is"<<str;
    qDebug()<<"a is "<< a;
    file.close();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值