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            在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n
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<<('\n')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
posted @ 2020-05-13 21:02  祁峰_1024  阅读(528)  评论(0编辑  收藏  举报