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
。输入已知,编码可能可以从输出中推断出来。(例如,aHe
在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;
}