• QT文件操作


    以下示例摘自豆子的qt学习之路

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        //创建一个文件对象,并用这个文件对象打开文件 "in.txt"
        QFile file("in.txt");
        //以只读方式打开文件,判断文件是否打开成功 
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            //打开不成功  可以执行 QMessageBox::warning("Error","Error message");
            qDebug() << "Open file failed.";
            return -1;
        } else {
            //打开成功,则按行读取文件内容,直到读取到最后一行 atEnd()为止
            while (!file.atEnd()) {
                qDebug() << file.readLine();
            }
        }
    
        //文件信息类     将文件对象作为参数传入文件信息对象
        QFileInfo info(file);
        //下面是一些示例
        //检查文件是否为目录
        qDebug() << info.isDir();
        //检查文件是否为可执行文件
        qDebug() << info.isExecutable();
        //文件名 (不带后缀的文件名)
        qDebug() << info.baseName();
        //带后缀的文件名
        qDebug() << info.completeBaseName();
        //文件后缀
        qDebug() << info.suffix();
        //带后缀的文件名
        qDebug() << info.completeSuffix();
        //文件名
        qDebug() << info.fileName();
        //带路径的文件名
        qDebug() << info.filePath();
        //只有文件路径
        qDebug() << info.Path();
    
        return app.exec();
    }

    二进制文件读写

    //建立文件对象 传入文件名作为参数
    QFile file("file.dat");
    //以只读方式打开该文件,然后判断文件是否打开成功
    file.open(QIODevice::WriteOnly);
    //标准输出流
    QDataStream out(&file);
    //将这两组数据流向file文件对象
    out << QString("the answer is");
    out << (qint32)42;
    file.close();

     写入读出数据

    //创建文件对象
    QFile file("file.dat");
    //只写方式打开文件
    file.open(QIODevice::WriteOnly);
    //输出流
    QDataStream out(&file);
    
    // 写入魔术数字和版本        (相当于报文头)
    out << (quint32)0xA0B0C0D0;
    out << (qint32)123;
    //设置qt打开版本
    out.setVersion(QDataStream::Qt_4_0);
    
    // 写入数据
    out << lots_of_interesting_data;

    根据上面的写入格式读出数据

    //创建文件对象
    QFile file("file.dat");
    //只读方式打开文件
    file.open(QIODevice::ReadOnly);
    //输入流
    QDataStream in(&file);
    
    // 检查魔术数字    如果和设定的不同 则 return
    quint32 magic;
    in >> magic;
    if (magic != 0xA0B0C0D0) {
        return BAD_FILE_FORMAT;
    }
    
    // 检查版本 版本号在100-123之间
    qint32 version;
    in >> version;
    if (version < 100) {
        return BAD_FILE_TOO_OLD;
    }
    if (version > 123) {
        return BAD_FILE_TOO_NEW;
    }
    if (version <= 110) {
        in.setVersion(QDataStream::Qt_3_2);
    } else {
        in.setVersion(QDataStream::Qt_4_0);
    }
    // 读取数据
    in >> lots_of_interesting_data;
    if (version >= 120) {
        in >> data_new_in_version_1_2;
    }
    in >> other_interesting_data;

     流的使用

    //只写方式打开 file.dat;
    QFile file("file.dat");
    file.open(QIODevice::ReadWrite);
    //
    QDataStream stream(&file);
    QString str = "the answer is 42";
    QString strout;
    //输入流
    stream << str;
    //刷新缓存
    file.flush();
    //输出流
    stream >> strout;

    用上述代码,将一段 string 通过流写入 file 中,然后再读出刚才写入的数据

    但是会失败

    因为 使用 << 操作符后,流的游标走到了最后,到时候再读数据就是继续往下走,当然没有数据了

    所以如果想读取刚才的数据,需要重新设定游标位置为0

    //只写方式打开 file.dat;
    QFile file("file.dat");
    file.open(QIODevice::ReadWrite);
    //
    QDataStream stream(&file);
    QString str = "the answer is 42";
    QString strout;
    //输入流
    stream << str;
    //刷新缓存
    file.flush();
    //设定游标位置为-0
    stream.device()->seek(0);
    //输出流
    stream >> strout;

    文本文件的读写

    看个例子

    //创建文件对象data
    QFile data("file.txt");
    //以只写方式打开,同时以 QIODevice::Truncate 方式打开
    if (data.open(QFile::WriteOnly | QIODevice::Truncate)) {
        QTextStream out(&data);
        //流入数据 the answer is 42
        out << "The answer is " << 42;
    }

    这里使用了QIODevice::Truncate 方式打开

    表示先清空原有文件数据,然后再写入新的数据

    打开方式的枚举值如下

    QIODevice::NotOpen        未打开
    QIODevice::ReadOnly        以只读方式打开
    QIODevice::WriteOnly    以只写方式打开
    QIODevice::ReadWrite    以读写方式打开
    QIODevice::Append        以追加的方式打开,新增加的内容将被追加到文件末尾
    QIODevice::Truncate        以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头。
    QIODevice::Text            在读取时,将行结束符转换成 
    ;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 
    
    QIODevice::Unbuffered    忽略缓存

    更改编码格式,默认是UTF-8,可以改成其他的

    stream.setCodec("UTF-8");

    文本描述符

    bin setIntegerBase(2)
    oct setIntegerBase(8)
    dec setIntegerBase(10)
    hex setIntegerBase(16)
    showbase setNumberFlags(numberFlags() | ShowBase)
    forcesign setNumberFlags(numberFlags() | ForceSign)
    forcepoint setNumberFlags(numberFlags() | ForcePoint)
    noshowbase setNumberFlags(numberFlags() & ~ShowBase)
    noforcesign setNumberFlags(numberFlags() & ~ForceSign)
    noforcepoint setNumberFlags(numberFlags() & ~ForcePoint)
    uppercasebase setNumberFlags(numberFlags() | UppercaseBase)
    uppercasedigits setNumberFlags(numberFlags() | UppercaseDigits)
    lowercasebase setNumberFlags(numberFlags() & ~UppercaseBase)
    lowercasedigits setNumberFlags(numberFlags() & ~UppercaseDigits)
    fixed setRealNumberNotation(FixedNotation)
    scientific setRealNumberNotation(ScientificNotation)
    left setFieldAlignment(AlignLeft)
    right setFieldAlignment(AlignRight)
    center setFieldAlignment(AlignCenter)
    endl operator<<(' ')flush()
    flush flush()
    reset reset()
    ws skipWhiteSpace()
    bom setGenerateByteOrderMark(true)

    举例:
    现在文本中有个一个数 123456

    现在需要输出他的二进制数

    则可以这样

    out << bin << 12345678;

    这里文本描述符 bin 就是二进制输出

    如果我要把1234567890 输出为 16进制 的0xBC614E

    就可以这样操做

    out << showbase << uppercasedigits << hex << 12345678;
    QIODevice::Text
  • 相关阅读:
    Sublime text 3支持utf-8
    ubuntu17.10 安装firefox的flash
    opencv mat裁剪
    Ubuntu寻找某某库
    Ubuntu的 g++ gcc版本升降级
    Autotools知识点
    Counted(内存管理机制)
    operator new和operator delete
    STL学习笔记:空间配置器allocator
    function call操作符(operator()) 仿函数(functor)
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12884882.html
Copyright © 2020-2023  润新知