Qt之文本文件读写

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

这样的函数进行设置。

另外,为方便起见,QTextStreamstd::cout一样提供了很多描述符,被称为 stream manipulators。因为文本文件是供人去读的,自然需要良好的格式(相比而言,二进制文件就没有这些问题,只要数据准确就可以了)。这些描述符是一些函数的简写,我们可以从文档中找到:

描述符等价于
binsetIntegerBase(2)
octsetIntegerBase(8)
decsetIntegerBase(10)
hexsetIntegerBase(16)
showbasesetNumberFlags(numberFlags() | ShowBase)
forcesignsetNumberFlags(numberFlags() | ForceSign)
forcepointsetNumberFlags(numberFlags() | ForcePoint)
noshowbasesetNumberFlags(numberFlags() & ~ShowBase)
noforcesignsetNumberFlags(numberFlags() & ~ForceSign)
noforcepointsetNumberFlags(numberFlags() & ~ForcePoint)
uppercasebasesetNumberFlags(numberFlags() | UppercaseBase)
uppercasedigitssetNumberFlags(numberFlags() | UppercaseDigits)
lowercasebasesetNumberFlags(numberFlags() & ~UppercaseBase)
lowercasedigitssetNumberFlags(numberFlags() & ~UppercaseDigits)
fixedsetRealNumberNotation(FixedNotation)
scientificsetRealNumberNotation(ScientificNotation)
leftsetFieldAlignment(AlignLeft)
rightsetFieldAlignment(AlignRight)
centersetFieldAlignment(AlignCenter)
endloperator<<('\n')flush()
flushflush()
resetreset()
wsskipWhiteSpace()
bomsetGenerateByteOrderMark(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

即可。

不仅是QIODeviceQTextStream也可以直接把内容输出到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/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值