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

 

  

posted @ 2024-07-04 01:15  蜡笔小新Pointer  阅读(30)  评论(0)    收藏  举报