文本流和二进制流简介:
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();