9.1 读写文本文件
9.1 读写文本文件
在Qt中读写文本文件有两种方式,一种是通过使用QTextStream,另一种则是通过QFile类来进行读写。
9.1.1 使用QFile类读写文本文件
案例:使用QFile类读写文本文件
(1)建立Qt的控制台应用程序(Console Application),名称为TextFile
(2)在main.cpp中编写以下代码
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
#include <QIODevice>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("/Users/admin/Desktop/TextFile/data");
/*
* enum OpenModeFlag {
NotOpen = 0x0000,//不对该文件进行打开
ReadOnly = 0x0001,//只读方式打开
WriteOnly = 0x0002,//写打开
ReadWrite = ReadOnly | WriteOnly,//可读可写
Append = 0x0004,//追加的方式打开,以这种方式打开的文件,假如在里面写入内容,则不会清空原有的内容,而会直接在其后追加
Truncate = 0x0008,//以这种方式打开的文件,假如在之前改文件中有内容,那么以这种方式打开之后,里面的内容会丢失
Text = 0x0010,//文本的方式,这种方式如果是写文件,那么就是写文本的操作
Unbuffered = 0x0020,//支持任何类型的数据流(文本或二进制流)
NewOnly = 0x0040,//如果要打开的文件已经存在,则会导致open失败,实际上这种方式只要求文件确确实实在磁盘上不存在,就类似于新建文件
ExistingOnly = 0x0080//与上面的相反,这种方式打开的文件要求这个文件必须事先存在在磁盘上,否则open操作会失败
};
*/
if(file.open(QIODevice::ReadOnly))//如果文件成功打开
{
char buf[4096] = {0};
qint64 lineLen = file.readLine(buf,sizeof(buf));//这里是会读文件的一行,读完之后,这个函数会返回这一次读了多少个字节
if(-1 != lineLen)
{
qDebug() << buf;
}
}
else
{
qDebug() << file.errorString();//如果出错则会输出具体的错误信息
}
file.close();
return a.exec();
}
9.1.2 QTextStream类读写文本
QTextStream提供了更为方便的方法来实现对文本的读写,它可以操作QIODevice、QByteArray和QString。使用其重载的流操作符,可以实现对单词,行,数字的读写。另外它还提供了填充,对齐和数字格式化的选项。
案例:使用QTextStream类来读写文本文件
(1)新建Qt的控制台项目,项目名称为TextStreamTest。
(2)在main.cpp中添加以下代码
#include <QCoreApplication>
#include <QTextStream>
#include <QIODevice>
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("/Users/admin/Desktop/TextStreamTest/data");//创建一个QFile对象
if(file.open(QIODevice::WriteOnly|QIODevice::Truncate))//以写的方式打开该文件对象,并且在写之前会将原有的内容清空
{
QTextStream textStream(&file);//使用文件对象来初始化一个文本流对象(当然还可以将内存作为文本流对象)
textStream << QString("Score:") << left << 90 << endl;//QTextStream重载了operator<<,因此我们可以使用这个操作符向流中写内容
textStream.setFieldWidth(10);//设置字段的宽度
file.close();//关闭文件
}
else
{
qDebug() << file.errorString();
}
return a.exec();
}
(3)运行程序,并可以找到data文件,打开它就可以看到我们写入进去的内容。
(4)实际上QTextStream中有很多的方法都是很常用的,以下做一个总结:
#include <QCoreApplication>
#include <QTextStream>
#include <QTextCodec>
#include <QLocale>
#include <QChar>
#include <QFile>
#include <QIODevice>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//1.关于QTextStream的几个重要的构造器
/*
QTextStream(const QByteArray &array, QIODevice::OpenMode openMode = QIODevice::ReadOnly)//通过一个QByteArray的常引用来构造一个QTextStream对象,由于IO对象是const的,因此后面的读写权限也只能是只读
QTextStream(QByteArray *array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)//通过QByteArray的指针来构造一个QTextStream对象,由于这里传入的指针既不是指针常量也不是常量指针,因此QTextStream可以对其进行读和写操作
QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)//通过字符串指针来构文本流对象,由于这里也既不是指针常量,也不是常量指针,所有后面的默认形参的读写方式也为可读可写
QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite)//通过C语言的文件指针来构造一个QTextStream对象(可以是stdout)
QTextStream(QIODevice *device)//通过Qt的IO设备指针来构造一个文本流对象(这个IO设备可以是文件,可以是标准输出,可以是打印机或其他具有输入和输出的特征的设备的设备)
QTextStream()//构造一个空的文本流对象
*/
{
//1.QTextStream(const QByteArray &array, QIODevice::OpenMode openMode = QIODevice::ReadOnly)
QByteArray array1("ABCDEFGHIJKLMN");
QTextStream stream1(array1);
stream1.operator<<("Hello");//不能往里面输入内容,因为是只读的
//2.QTextStream(QByteArray *array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QByteArray array2("Hello,World!");
QTextStream stream2(&array2);
stream2.operator<<("HaHa");//可以写入内容
qDebug() << stream2.readAll();
//3.QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QString str("This Is String");
QTextStream stream3(&str);
stream3.operator<<("ABCDEF");//OK
qDebug() << stream3.readAll();
//4.QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream stream4(stdout);
stream4.operator<<("Hello,STDOUT!");
//5.QTextStream(QIODevice *device)
QFile file("./file");
if(file.open(QIODevice::ReadWrite))
{
QTextStream stream5(&file);
stream5.operator<<("This Is A File!");
}
else
{
qDebug() << file.errorString();
}
file.close();
}
//2.QTextStream的一些常用的成员方法
///bool atEnd() const
{
//该方法用于判断该文本流中的IO对象中的流的内容是否已经到末尾了
qDebug() << "----bool atEnd() const----";
QString str("ABCDEFGHIJKLMN");
QTextStream stream(&str);
do
{
QChar ch;
stream.operator>>(ch);
qDebug() << ch;
}while(!stream.atEnd());
qDebug() << "----END bool atEnd() const----";
}
///bool autoDetectUnicode() const
///void setAutoDetectUnicode(bool enabled)
{
qDebug() << "----bool autoDetectUnicode() const----";
//该方法用于获取当前的文本流是否开启了自动根据文本的Unicode特征来自动分析文本的编码格式(默认是true)
//该方法用于设置是否要启用自动分析文本流中IO中内容的Unicode编码
QString str("哈哈");
QTextStream stream(&str);
qDebug() << "autoDetectUnicode:" << stream.autoDetectUnicode();
qDebug() << "----END bool autoDetectUnicode() const----";
}
///QTextCodec *codec() const
{
qDebug() << "----QTextCodec *codec() const----";
//该方法用于获取当前文本流中文本的编码格式
QString str("喝喝");
QTextStream stream(&str);
qDebug() << stream.codec()->name();
qDebug() << "----END QTextCodec *codec() const----";
}
///QIODevice *device() const
{
qDebug() << "----QIODevice *device() const----";
//该方法用于返回文本流中的IO对象(也就是构造函数中的那个IO对象)
QFile file("./file");
if(file.open(QIODevice::ReadWrite))
{
QTextStream stream(&file);
QIODevice*device = stream.device();
do
{
char ch;
device->read(&ch,1);
qDebug() << ch;
}while(!device->atEnd());
}
else
{
file.close();
}
file.close();
qDebug() << "----END QIODevice *device() const----";
}
///void setPadChar(QChar ch)
///void setFieldAlignment(QTextStream::FieldAlignment mode)
///void setFieldWidth(int width)
{
//设置填充字符
//设置填充字符和非填充字符的对齐方式
//设置填充的宽度(这包含了填充字符的个数和要输出的字符的总个数)
qDebug() << "----void setPadChar(QChar ch);void setFieldAlignment(QTextStream::FieldAlignment mode);void setFieldWidth(int width)----";
QTextStream stream(stdout);
stream.setFieldWidth(5);//设置宽度为5
stream.setPadChar('*');//设置填充字符为*
stream.setFieldAlignment(QTextStream::FieldAlignment::AlignLeft);//设置为左对齐(就是说,如果我输出的字符个数少于5个,那么这个填充字符会被填充在输出字符的右边)
stream.operator<<("ABC");//ABC**
stream.setFieldAlignment(QTextStream::FieldAlignment::AlignRight);//设置为右对齐
stream.operator<<("DEF");//**DEF
stream.setFieldAlignment(QTextStream::FieldAlignment::AlignCenter);//居中对齐
stream.operator<<("HIJ");//*HIJ*
qDebug() << "----END void setPadChar(QChar ch);void setFieldAlignment(QTextStream::FieldAlignment mode);void setFieldWidth(int width)----";
}
///QTextStream::FieldAlignment fieldAlignment() const
///QChar padChar() const
///int fieldWidth() const
{
qDebug() << "----QTextStream::FieldAlignment fieldAlignment() const;QChar padChar() const;int fieldWidth() const----";
//返回当前文本流中所使用的填充字符的对齐方式
//返回当前文本流中的填充字符
//返回当前文本流中的字符最大宽度
QTextStream stream(stdout);
stream.setFieldWidth(5);
stream.setFieldAlignment(QTextStream::FieldAlignment::AlignCenter);
stream.setPadChar('&');
switch (stream.fieldAlignment())
{
case QTextStream::FieldAlignment::AlignLeft:
qDebug() << "QTextStream::FieldAlignment::AlignLeft";
break;
case QTextStream::FieldAlignment::AlignRight:
qDebug() << "QTextStream::FieldAlignment::AlignRight";
break;
case QTextStream::FieldAlignment::AlignCenter:
qDebug() << "QTextStream::FieldAlignment::AlignCenter";
break;
}
qDebug() << "stream.padChar():" << stream.padChar();
qDebug() << "stream.fieldWidth():" << stream.fieldWidth();
qDebug() << "----END QTextStream::FieldAlignment fieldAlignment() const;QChar padChar() const;int fieldWidth() const----";
}
///void flush()
{
//该方法会刷新文本流中任何即将被写入到IO设备中的数据,如果打开的流对象是QString指针,那么这个函数没有作用
qDebug() << "----void flush()----";
QFile bufferFile("./bufferFile");
if(bufferFile.open(QIODevice::ReadWrite))
{
QTextStream stream(&bufferFile);
stream.operator<<("Hello,World!");
stream.flush();
stream.operator<<("ABCDEFG");
}
else
{
qDebug() << bufferFile.errorString();
}
bufferFile.close();
qDebug() << "----END void flush()----";
}
///bool generateByteOrderMark() const
///void setGenerateByteOrderMark(bool generate)
{
qDebug() << "----bool generateByteOrderMark() const----";
//若文本流被设置了生成UTF8-BOM编码,则会返回true,否则是false;默认情况下是false
//设置是否要对文本流中的UTF8编码格式的基础上设置BOM标记
//UTF8和带BOM的UTF8有什么区别?
//一般情况下的UTF8,它其中的文本编码中的编码是无序的(这个描述的是字节序的又无序),而BOM(Byte Order Mark)则是要求是有序的,因为对于一些特殊的处理器,它就得需要按照特定顺序的字节序去解析UTF8文档
QFile file("./bomCodec");
if(file.open(QIODevice::ReadWrite))
{
QTextStream stream(&file);
qDebug() << "stream.generateByteOrderMark():" << stream.generateByteOrderMark();
stream.setGenerateByteOrderMark(true);
}
else
{
qDebug() << file.errorString();
}
qDebug() << "----END bool generateByteOrderMark() const----";
file.close();
}
///int integerBase() const
///void setIntegerBase(int base)
{
qDebug() << "----stream.integerBase()----";
//该成员方法会输出当前文本流中所输出的数字的所用的进制
//设置当文本流输出数字时所用的进制
QTextStream stream(stdout);
stream.operator<<(123);
qDebug() << stream.integerBase();//0或10都表示当前输出的数字所用的进制是10
qDebug() << "----END stream.integerBase()----";
}
///QLocale locale() const
{
qDebug() << "----QLocale locale() const----";
//该方法用于输出文本流中所使用的本地化的相关内容,比如所在的国家或地区或语言等信息
QTextStream stream(stdout);
QLocale locale = stream.locale();
switch (locale.language())
{
case QLocale::Language::C:
qDebug() << locale.languageToString(QLocale::Language::C);
break;
case QLocale::Language::Chinese:
break;
}
qDebug() << "----END QLocale locale() const----";
}
///QTextStream::NumberFlags numberFlags() const
{
qDebug() << "----QTextStream::NumberFlags numberFlags() const----";
//该函数会返回当前文本流中在输出数字时的一些规则表示,例如显示进制前缀,或者是将进制前缀全部大写,又或者是强制加小数点抑或只是加正负号等
QTextStream stream(stdout);
stream.setIntegerBase(2);//假设我这里用二进制
stream.setNumberFlags(QTextStream::NumberFlag::ShowBase|QTextStream::NumberFlag::UppercaseBase);//显示进制前缀以及进制前缀字母全大写
stream.operator<<(12).operator<<('\n');//0B1100
stream.reset();
stream.setNumberFlags(QTextStream::NumberFlag::ForcePoint|QTextStream::NumberFlag::ForceSign);
stream.operator<<(320);//+320
/*
QTextStream::ShowBase 显示数字的进制前缀
QTextStream::ForcePoint 强制显示小数点
QTextStream::ForceSign 强制显示符号位
QTextStream::UppercaseBase 将进制前缀的字母使用全大写来表示
QTextStream::UppercaseDigits 用大写字母来代替显示10~35之间的小写字母数字
*/
qDebug() << "----END QTextStream::NumberFlags numberFlags() const----";
}
///QTextStream::NumberFlags numberFlags() const
{
//该成员返回当前的数字的规则标识
QTextStream stream(stdout);
stream.setNumberFlags(QTextStream::NumberFlag::ShowBase);
switch(stream.numberFlags())
{
case QTextStream::NumberFlag::ShowBase:
qDebug() << "QTextStream::NumberFlag::ShowBase";
break;
case QTextStream::NumberFlag::ForceSign:
qDebug() << "QTextStream::NumberFlag::ForceSign";
break;
}
}
///qint64 pos() const
{
qDebug() << "----qint64 pos() const----";
//该成员会返回文本流中此时此刻流的位置
QString str("ABCDEFG");
QTextStream stream(&str);
do
{
QChar ch;
qint64 pos = stream.pos();
stream.operator>>(ch);
qDebug() << pos << ":" << ch;
}while(!stream.atEnd());
qDebug() << "----END qint64 pos() const----";
}
///QString read(qint64 maxlen)
{
//该方法用于从文本流中一次最多读取maxlen个字符
qDebug() << "----QString read(qint64 maxlen)----";
QString str("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
QTextStream stream(&str);
QString s1 = stream.read(2);
qDebug() << s1;
s1 = stream.read(4);
qDebug() << s1;
qDebug() << "----END QString read(qint64 maxlen)----";
}
///QString readAll()
{
qDebug() << "----QString readAll()----";
//该方法用于从文本流中一次性读完该流对象中所有的内容(如果文件很大的时候,不要使用这个函数,因为会很费RAM的)
QString str("ABCDEFGHIJKLMN");
QTextStream stream(&str);
qDebug() << stream.readAll();
qDebug() << "----END QString readAll()----";
}
///QString readLine(qint64 maxlen = 0)
{
qDebug() << "----QString readLine(qint64 maxlen = 0)----";
//该方法用于从文本流中读一行内容,这一行内容的最大的字符个数时maxlen个
QString str("ABC\nDEF\nGHI\nJKL");
QTextStream stream(&str);
do
{
qDebug() << stream.readLine(3);
}while(!stream.atEnd());
qDebug() << "----END QString readLine(qint64 maxlen = 0)----";
}
///bool readLineInto(QString *line, qint64 maxlen = 0)
{
qDebug() << "----bool readLineInto(QString *line, qint64 maxlen = 0)----";
//该方法会读一行内容到某个QString的缓冲区中
QString data("Hello,World!");
QTextStream stream(&data);
QString buf;
stream.readLineInto(&buf,data.length());
qDebug() << buf;
qDebug() << "----END bool readLineInto(QString *line, qint64 maxlen = 0)----";
}
///void QTextStream::setRealNumberNotation(QTextStream::RealNumberNotation notation)
///QTextStream::RealNumberNotation realNumberNotation() const
{
qDebug() << "----void QTextStream::setRealNumberNotation(QTextStream::RealNumberNotation notation);QTextStream::RealNumberNotation realNumberNotation() const----";
//设置实数的表示方式
//该方法会返回当前文本流所用的实数的表示方式
QTextStream stream(stdout);
stream.setRealNumberNotation(QTextStream::ScientificNotation);//采用科学计数法来表示(相当于printf中的%e)
switch (stream.realNumberNotation())
{
case QTextStream::RealNumberNotation::FixedNotation:
qDebug() << "QTextStream::RealNumberNotation::FixedNotation";
break;
case QTextStream::RealNumberNotation::SmartNotation:
qDebug() << "QTextStream::RealNumberNotation::SmartNotation";
break;
case QTextStream::RealNumberNotation::ScientificNotation:
qDebug() << "QTextStream::RealNumberNotation::ScientificNotation";
break;
}
stream.operator<<(123.45678).operator<<('\n');//1.234568e+02
stream.setRealNumberNotation(QTextStream::RealNumberNotation::FixedNotation);//一般的小数表示,相当于%f
switch (stream.realNumberNotation())
{
case QTextStream::RealNumberNotation::FixedNotation:
qDebug() << "QTextStream::RealNumberNotation::FixedNotation";
break;
case QTextStream::RealNumberNotation::SmartNotation:
qDebug() << "QTextStream::RealNumberNotation::SmartNotation";
break;
case QTextStream::RealNumberNotation::ScientificNotation:
qDebug() << "QTextStream::RealNumberNotation::ScientificNotation";
break;
}
stream.operator<<(1234567.12321).operator<<('\n');
stream.setRealNumberNotation(QTextStream::RealNumberNotation::SmartNotation);//相当于%g,数字在一定的范围内采用一般的表示形式,过大时,采用科学计数法表示
switch (stream.realNumberNotation())
{
case QTextStream::RealNumberNotation::FixedNotation:
qDebug() << "QTextStream::RealNumberNotation::FixedNotation";
break;
case QTextStream::RealNumberNotation::SmartNotation:
qDebug() << "QTextStream::RealNumberNotation::SmartNotation";
break;
case QTextStream::RealNumberNotation::ScientificNotation:
qDebug() << "QTextStream::RealNumberNotation::ScientificNotation";
break;
}
stream.operator<<(123456789.1234456).operator<<('\n');
qDebug() << "----END void QTextStream::setRealNumberNotation(QTextStream::RealNumberNotation notation);QTextStream::RealNumberNotation realNumberNotation() const----";
}
///void QTextStream::setRealNumberPrecision(int precision)
///int realNumberPrecision() const
{
qDebug() << "----void QTextStream::setRealNumberPrecision(int precision);int realNumberPrecision() const----";
//设置实数的显示精度(也就是说显示有效位数)
QTextStream stream(stdout);
stream.setRealNumberPrecision(2);
stream.operator<<(3.1415).operator<<('\n');//3.1
stream.setRealNumberPrecision(4);
stream.operator<<(3.14159).operator<<('\n');//3.142
qDebug() << "----END void QTextStream::setRealNumberPrecision(int precision);int realNumberPrecision() const----";
}
///void reset()
{
qDebug() << "----void reset()----";
//该函数用于重置文本流中的格式字符串,将文本流恢复到构造时的状态
QTextStream stream(stdout);
stream.setNumberFlags(QTextStream::NumberFlag::ShowBase);
stream.setIntegerBase(2);
stream.operator<<(123).operator<<('\n');//0b1111011
stream.reset();
stream.operator<<(123).operator<<('\n');//123
qDebug() << "----END void reset()----";
}
///void resetStatus()
///QTextStream::Status status() const
///void setStatus(QTextStream::Status status)
{
//重置文本流的状态
//返回当前文本流所设置的状态
//设置文本流的状态
qDebug() << "----void resetStatus();QTextStream::Status status() const;void setStatus(QTextStream::Status status)----";
QTextStream stream(stdout);
stream.operator<<("Hello,World!");
switch (stream.status())
{
case QTextStream::Status::Ok://文本流的状态正常
qDebug() << "QTextStream::Status::Ok";
break;
case QTextStream::Status::ReadPastEnd://文本流已读取到IO设备的内容的末尾
qDebug() << "QTextStream::Status::ReadPastEnd";
break;
case QTextStream::Status::ReadCorruptData:
qDebug() << "QTextStream::Status::ReadCorruptData";//文本流读取了损坏的内容
break;
case QTextStream::Status::WriteFailed:
qDebug() << "QTextStream::Status::WriteFailed";//文本流写入到设备失败
break;
}
stream.setStatus(QTextStream::Status::ReadPastEnd);
stream.operator<<("ABCDEFG");
qDebug() << "----END void resetStatus();QTextStream::Status status() const;void setStatus(QTextStream::Status status)----";
}
///bool seek(qint64 pos)
{
qDebug() << "----bool seek(qint64 pos)----";
//该成员函数用于设置流的位置
QString data("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
QTextStream stream(&data);
qDebug() << stream.read(2);
stream.seek(13);
qDebug() << stream.read(4);
qDebug() << "----END bool seek(qint64 pos)----";
}
///void setCodec(QTextCodec *codec)
///void setCodec(const char *codecName)
{
//该方法用于设置文本流的编码格式(Utf8或GBK又或者是其他的编码)
qDebug() << "----void setCodec(QTextCodec *codec);void setCodec(const char *codecName)----";
qDebug() << QTextCodec::availableCodecs();//通过QTextCoodec的avaliableCodes方法可以获得当前系统中支持的文本编码格式
QFile gbkFile("./gbkFile");
if(gbkFile.open(QIODevice::ReadWrite))
{
QTextCodec*gbkCode = QTextCodec::codecForName("GBK");
QTextStream stream(&gbkFile);
stream.setCodec(gbkCode);
stream.operator<<("这是一个GBK格式编码的文件哦!");
}
else
{
qDebug() << gbkFile.errorString();
}
gbkFile.close();
qDebug() << "----END void setCodec(QTextCodec *codec);void setCodec(const char *codecName)----";
}
///void setDevice(QIODevice *device)
{
qDebug() << "----void setDevice(QIODevice *device)----";
//该方法用于在使用文本流的过程中切换IO对象
QFile oldFile("./old"),newFile("./new");
if(oldFile.open(QIODevice::ReadWrite)&&newFile.open(QIODevice::ReadWrite))
{
QTextStream stream(&oldFile);
stream.operator<<("Hello,");//我先在old文件上写一个字符串
stream.setDevice(&newFile);//设置IO对象到文件new上
stream.operator<<("World!");//输出内容
}
else
{
qDebug() << oldFile.errorString();
qDebug() << newFile.errorString();
}
oldFile.close();
newFile.close();
qDebug() << "----END void setDevice(QIODevice *device)----";
}
///void setLocale(const QLocale &locale)
{
qDebug() << "----void setLocale(const QLocale &locale)----";
//该方法用于设置文本流中语言本地化的相关内容
QTextStream stream(stdout);
stream.setLocale(QLocale(QLocale::Language::Chinese));
qDebug() << "----END void setLocale(const QLocale &locale)----";
}
///QString *string() const
///void setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
{
qDebug() << "----QString *string() const;void setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)----";
//该方法会返回当我们使用QTextStream的构造函数QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)时传入的QString的指针,其实这和device()方法雷同,只不过一个是字符串指针,另一个是设备的指针
QString data1("ABCDEFG"),data2("HHHHHHH");
qDebug() << (&data1) << "-" << (&data2);
QTextStream stream(&data1);
qDebug() << "data1 Address:" << stream.string();
stream.setString(&data2);
qDebug() << "----END QString *string() const;void setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)----";
}
return a.exec();
}
本节内容代码:https://files.cnblogs.com/files/blogs/792763/TextIO.zip?t=1720026885&download=true

浙公网安备 33010602011771号