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