zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    PAT (Advanced Level) 1010. Radix (25)
    PAT (Advanced Level) 1009. Product of Polynomials (25)
    PAT (Advanced Level) 1008. Elevator (20)
    PAT (Advanced Level) 1007. Maximum Subsequence Sum (25)
    PAT (Advanced Level) 1006. Sign In and Sign Out (25)
    PAT (Advanced Level) 1005. Spell It Right (20)
    PAT (Advanced Level) 1004. Counting Leaves (30)
    PAT (Advanced Level) 1001. A+B Format (20)
    PAT (Advanced Level) 1002. A+B for Polynomials (25)
    PAT (Advanced Level) 1003. Emergency (25)
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12884882.html
Copyright © 2011-2022 走看看