QFile data("file.txt");
if (data.open(QFile::ReadOnly)) {
QTextStream in(&data);
QString str;
int ans = 0;
in >> str >> ans;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
在使用QDataStream
的时候,这样的代码很方便,但是使用了QTextStream
时却有所不同:读出的时候,str 里面将是 The answer is 42,ans 是 0。这是因为以文本形式写入数据,是没有数据之间的分隔的。还记得我们前面曾经说过,使用QDataStream
写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而文本文件则没有类似的操作。因此,使用文本文件时,很少会将其分割开来读取,而是使用诸如QTextStream::readLine()
读取一行,使用QTextStream::readAll()
读取所有文本这种函数,之后再对获得的QString
对象进行处理。
默认情况下,QTextStream
的编码格式是 Unicode,如果我们需要使用另外的编码,可以使用
C/C++
1 lines
stream.setCodec("UTF-8");
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这样的函数进行设置。
另外,为方便起见,QTextStream
同std::cout
一样提供了很多描述符,被称为 stream manipulators。因为文本文件是供人去读的,自然需要良好的格式(相比而言,二进制文件就没有这些问题,只要数据准确就可以了)。这些描述符是一些函数的简写,我们可以从文档中找到:
描述符 等价于 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)
这些描述符只是一些函数的简写。例如,我们想要输出 12345678 的二进制形式,那么可以直接使用
C/C++
1 lines
1
out << bin << 12345678;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
就可以了。这等价于
C/C++
2 lines
1
2
out.setIntegerBase(2);
out << 12345678;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
更复杂的,如果我们想要舒服 1234567890 的带有前缀、全部字母大写的十六进制格式(0xBC614E),那么只要使用
C/C++
1 lines
1
out << showbase << uppercasedigits << hex << 12345678;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
即可。
不仅是QIODevice
,QTextStream
也可以直接把内容输出到QString
。例如
C/C++
2 lines
1
2
QString str;
QTextStream(&str) << oct << 31 << " " << dec << 25 << endl;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这提供了一种简单的处理字符串内容的方法。
转载:https://www.devbean.net/2013/01/qt-study-road-2-text-file-io/