当前位置:   article > 正文

Qt读写文件出现丢失固定值字节的问题(0x0d,0x0d 0x0a)_qstring 添加'0x0d

qstring 添加'0x0d

环境:win10,Qt5.9.7 + msvc2017

问题:读bin文件时,发现出现丢失字节,且为固定字节0x0d,后查阅Qt帮助得知因为文件打开方式包含QIODevice::Text。

Constant

Description

QIODevice::Text

When reading, the end-of-line terminators are translated to '\n'. When writing, the end-of-line terminators are translated to the local encoding, for example '\r\n' for Win32.

QIODevice::Text的描述为:读取时,行尾终止符转换为'\n'。写入时,行尾终止符转换为本地编码,例如用于win32的'\r\n'。

后面针对两种情况做了测试。

写入代码:

  1. QString path = QDir::currentPath() + "/test.txt";
  2. QFile file(path);
  3. if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
  4. {
  5. qDebug() << "write open file failed";
  6. return;
  7. }
  8. QByteArray array;
  9. array.clear();
  10. char temp = 13;
  11. array.append(temp);
  12. temp = 10;
  13. array.append(temp);
  14. temp = 1;
  15. array.append(temp);
  16. temp = 12;
  17. array.append(temp);
  18. QTextStream in(&file);
  19. in.setCodec(QTextCodec::codecForName("UTF-8"));
  20. in<<array;
  21. file.close();

 按顺序写入0x0d,0x0a,0x01,0x0c;

读取代码:

  1. QString xmlfilepath = QFileDialog::getOpenFileName(this, tr("Open XML File"), QDir::currentPath(), "*.txt");
  2. QFile tagfile(xmlfilepath);
  3. if(!tagfile.open(QIODevice::ReadOnly ))
  4. {
  5. qDebug() << "(read)Open Tag.csv file failed !";
  6. return ;
  7. }
  8. QTextStream out(&tagfile);
  9. out.setCodec(QTextCodec::codecForName("GB18030"));
  10. QString str = out.readAll();
  11. //QByteArray array = tagfile.readAll();
  12. tagfile.close();
  13. qDebug() << str;

不带QIODevice::Text读取结果如下:

"\r\r\n\u0001\f"

会比理论写入多一个'\r'字符。

带QIODevice::Text读取结果如下:

"\n\u0001\f"

会将字符'\r'也就是字节0x0d丢掉。

补充:

字符描述
\n换行(LF)10
\f换页(FF)12
\r回车(CR)13

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/652696
推荐阅读