C++ Qt cpp-将QString写入文本文件的干净方法

C++ Qt cpp-将QString写入文本文件的干净方法,c++,qt,iostream,qstring,C++,Qt,Iostream,Qstring,我需要找到一种干净快速的方法在.csv文件中编写QString。 我试过: QString path=QCoreApplication::applicationDirPath()+QString(“/myfile.csv”); QFile文件(路径); QString mystring=“你好,世界!”; 如果(!file.open(QIODevice::WriteOnly)){ file.close(); }否则{ QTextStream out(&file);out由于Andrey尚未做出反

我需要找到一种干净快速的方法在
.csv
文件中编写
QString
。 我试过:

QString path=QCoreApplication::applicationDirPath()+QString(“/myfile.csv”);
QFile文件(路径);
QString mystring=“你好,世界!”;
如果(!file.open(QIODevice::WriteOnly)){
file.close();
}否则{

QTextStream out(&file);out由于Andrey尚未做出反应,我将介入并提供有关OPs问题的一些背景信息:

来自Qt文档。关于:

该类提供Unicode字符串

存储由16位s组成的字符串,其中每个s对应一个Unicode 4.0字符。(代码值高于65535的Unicode字符使用代理项对存储,即两个连续的s。)

来自Qt文档。关于:

将字符串写入流,并返回对的引用。在将字符串写入流之前,首先使用指定的编解码器(默认编解码器为)对其进行编码

一般来说:

在内部,使用基于Unicode的缓冲区,QTextStream使用该缓冲区自动支持不同的字符集。默认情况下,用于读取和写入,但您也可以通过调用设置编解码器。还支持自动Unicode检测。启用此功能时(默认行为),将检测UTF-16或UTF-32 BOM(字节顺序标记),并在读取时切换到相应的UTF编解码器。默认情况下不写入BOM,但您可以通过调用(true)来启用此功能

所以,
“???????”
可能是
你好,世界!
编码在或OPs视图工具(输出了
“???????”
)无法检测到这种编码,甚至不支持这种编码

提示,改为:

file.write(mystring.toUtf8());
QString
内容转换为

  • 由字节组成
  • 与前127个字符相同
返回;并且很可能未更改地写入这些字节。(文档中甚至没有提到这一点。)

因此,
Hello,World!
仅由ASCII表中可用的字符组成(代码<127)。即使OPs view tool支持/期望,例如,它也不会注意到这一点。(我假设无法检测/处理UTF-16或UTF-32的工具可能也无法检测/处理UTF-8。)


顺便说一句,为了找出
“???”
实际上是什么编码,可以使用十六进制视图工具查看
myfile.csv
。输入已知,编码可能可以从输出中推断出来。(例如,a
He
在ASCII和UTF-8中为
0x48 0x65
,但在UTF-16LE中为
0x48 0x00 0x65 0x00
,在UTF-16BE中为
0x00 0x48 0x00 0x65
。)


我试图用一个简单的例子来再现这个问题

testQTextStreamEncode.cc

#include <QtWidgets>

int main(int, char**)
{
  const QString qString = "Hello, World!";
  const QString qPath("testQTextStreamEncoding.txt");
  QFile qFile(qPath);
  if (qFile.open(QIODevice::WriteOnly)) {
    QTextStream out(&qFile); out << qString;
    qFile.close();
  }
  return 0;
}
在这方面,我做到了:

$qmake-qt5
$make
g++-c-fno保持内联dllexport-D_GNU_SOURCE-pipe-O2-Wall-W-D_REENTRANT-DQT_NO_DEBUG-DQT_WIDGETS-LIB-DQT_GUI_-LIB-DQT_CORE_-LIB-I.-isystem/usr/include/qt5-isystem/usr/include/qt5/QtWidgets-isystem/usr/include/qt5/QtGui-isystem/usr/include/QtGui-isystem/isystem/usr/include/qt5/QtGui-isystem/usr/usr/include/QtGui/QtCore/QtCoreamEncoding.cc
g++-o testQTextStreamEncoding.exe testQTextStreamEncoding.o-lQt5Widgets-lQt5Gui-lQt5Core-lGL-lpthread
$./testQTextStreamEncoding
$hextdump.exe-C testqtextravelencoding.txt
00000000 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 |你好,世界|
0000000天
$
所以,我似乎无法复制OP所描述的东西。 我还尝试了在VS2013中编译和运行的代码:

$rm testQTextStreamEncoding.txt;ls testQTextStreamEncoding.txt
ls:无法访问“testQTextStreamEncoding.txt”:没有此类文件或目录
(编译,在VS2013中运行)

$hextump.exe-C testqtextravelencoding.txt
00000000 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 |你好,世界|
0000000天
$

同样,我无法重现。看看OP如何生成
“??”以及它实际包含的内容会很有趣。

file.write(mystring.toUtf8());我无法重现您的问题。您确定只使用ASCII字符,如示例“Hello,world!”?@vahancho是的,但第一条评论是有效的!@AndreySemenov如果你写下你的评论作为答案,我会把它作为解决方案:-)@Elena Naah Scheff写了非常好的答案)
#include <QtWidgets>

int main(int, char**)
{
  const QString qString = "Hello, World!";
  const QString qPath("testQTextStreamEncoding.txt");
  QFile qFile(qPath);
  if (qFile.open(QIODevice::WriteOnly)) {
    QTextStream out(&qFile); out << qString;
    qFile.close();
  }
  return 0;
}