QString,QFile,QTextStream和QTextCodec简介


虽然C++标准中有了文件读取的相关类,也很好用,但是在涉及到QT编程的时候却用起来不方便了,因为QT本身很多组件都是关联的自身的QString类 型的字符串,所以再用C++本身String类型的时候就不是那么方便了,需要进行转化,这样给程序带来了复杂度,同时也带来了转化的开销,所以如果用 QT开发,可以就用它本身所带的这些类型进行处理,形成一个系统,便于数据在程序之中的交互和共用。
QT很好,但是在处理中文或者其他语言的时候要注意编码格式,如果没有注意,读取文件的时候可能读出来的就是乱码或者干脆程序就死掉了,这是我们所不愿意看到的,下面就讲讲怎么样通过QT的类来读取中文文件。


介绍部分
我们需要用到几个头文件中的类:
#include <qstring.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qtextcodec.h>

QString

QString类提供了一个Unicode文本和经典的C以零结尾的字符数组的抽象。
QString使用隐含共享,这使它非常有效率并且很容易使用。
所有的QString的方法都使用const char *参数,const char *被解释为经典的C风格的以零结尾的ASCII字符串。所以const char *参数为0是合法的。如果const char *不是以零结尾的,结果是不确定的。把经典的C字符串复制到QString的函数将不会复制结尾的0字符。QString的QChar数组(可以通过 unicode()返回)通常不以零结尾。如果你需要把QString传递到一个需要C的以零结尾的字符串,请使用latin1()。
没有分配任何东西的QString是零,也就是长度和数据指针都为0。引用空字符串(“”,一个单一的'\0'字符)的QString是空。零和空这两个 QString在方法中都是合法的。把(const char *) 0赋值给QString给定了一个零QString。为了方便,QString::null是一个零QString。当排序的时候,空字符串在最前面,然 后是非空字符串,然后才是零字符串。我们建议使用if ( !str.isNull() ),而不是if ( !str )来检测非零字符串,关于解释说明也可以参考operator!()。
注意如果你发现你正在混合使用QCString、QString和QByteArray,这将会导致很多不必要的复制并且也许会预示着你正在处理的真实自 然数据是不确定的。如果数据是以零结尾的八位数据,请使用QCString;如果它是没有结尾的(也就是包含0)八位数据,请使用QByteArray; 如果它是文本,请使用QString。
字符串列表可以使用QStringList类来处理。你可以使用QStringList::split()来把一个字符串分割为一个字符串列表,并且可以 使用QStringList::join()把一个字符串列表连接成一个使用随意间隔符的字符串。你也可以使用QStringList::grep()从 一个字符串列表中获得包含特定子字符串或者包含匹配特定的regex的字符串列表。


QFile

QFile类是一个操作文件的输入/输出设备。
QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用,但是如果和QDataStream或QTextStream一起使用将更加方便。
文件名通常可以通过构造函数来传递,但也可以使用setName()来设置。你可以通过exists()来检查一个文件是否存在并且可以通过remove()来移去一个文件。
文件可以用open()来打开、用close()来关闭、用flush()来刷新。数据通常可以使用QDataStream或者QTextStream进 行读写,但你也可以使用readBlock()和readLine()来读,使用writeBlock()来写。QFile也支持getch()、 ungetch()和putch()。
size()可以返回文件的大小。你可以通过使用at()函数得到当前文件位置或者移到一个新的文件位置。如果你到了文件的末尾,atEnd()返回真。handle()返回文件句柄。
这里是一个使用QTextStream来一行一行地读取一个文本文件的代码段。它会把每一行带上一个行号打印出来。

QStringList lines;
QFile file( "file.txt" );
if ( file.open( IO_ReadOnly ) ) {
QTextStream stream( &file );
QString line;
int n = 1;
while ( !stream.eof() ) {
line = stream.readLine(); // 不包括“\n”的一行文本
printf( "%3d: %s\n", n++, line.latin1() );
lines += line;
}
file.close();
}

写文本也很容易(假设我们有一个行的字符串列表要写):

QFile file( "file.txt" );
if ( file.open( IO_WriteOnly ) ) {
QTextStream stream( &file );
for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it )
stream << *it << "\n";
file.close();
}

QTextStream

QTextStream类提供了使用QIODevice读写文本的基本功能。
文本流类的功能界面和标准的C++的iostream类非常相似。iostream和QTextStream的不同点是我们的流操作在一个很容易被继承的QIODevice上,而iostream只能操作一个不能被继承的FILE *指针。
Qt提供了几个和iostream相似的全局函数:
bin设置QTextStream来读/写二进制数字
oct设置QTextStream来读/写八进制数字
dec设置QTextStream来读/写十进制数字
hex设置QTextStream来读/写十六进制数字
endl强制换行
flush强制QIODevice刷新任何被缓存的数据
ws作为任何可用的控制符(在输入的时候)
reset重新设置QTextStream为它的缺省模式(请见reset())
qSetW(int)设置字段宽度作为指定参数
qSetFill(int)设置填充字符作为指定参数
qSetPrecision(int)设置精确度作为指定参数
警告:默认情况下,QTextStream在读取流的时候,会自动地检测流中的数字是十进制、八进制、十六进制或者二进制格式。具体情况是,一个以“0”为开头的数字是八进制的,比如顺序为“0100”将会被解释为64。
QTextStream类读写文本,它不适合处理二进制数据(而QDataStream是适合的)。
默认情况下,输出的是使用本地8位编码后的Unicode文本(比如,QString)。这些可以使用setEncoding()方法进行改变。对于输 入,QTextStream会自动检测标准Unicode“字节顺序标记的”文本文件,否则会使用本地8位编码。
QIODevice在构造函数中被设置,或者之后在setDevice()中使用。如果输入到达了atEnd(),返回真。数据可以使用 operator>>()重载操作符读到适当类型的变量中,或者使用read()把它作为整个部分读到一个单一的字符串中,或者使用 readLine()把一次读一行。使用skipWhiteSpace()可以忽略控制符。你可以使用flags()或setf()来设置流的标记。这个 流也支持width()、precision()和 fill(),使用reset()可以重新恢复默认设置。
也可以参考QDataStream、输入/输出和网络和文本相关类.



QTextCodec

QTextCodec 类提供文本编码之间的转换。
QT使用Unicode来存储,绘制以及操作字符串。在很多情况下,你可能想要使用不同的编码方式来处理数据。例如大部分的日语文件都被存储在 Shift-JIS或者 ISO2022的文件中,而俄罗斯的用户常常使用KOI8-R或者CP1251编码方式。QT提供了一个QTextCodec 类集合来从Unicode格式转化到相应的格式。



代码部分

#include <qstring.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qtextcodec.h>

int main()
{
QFile file("test.txt");
if (file.open(IO_ReadOnly|IO_Raw))
{
QTextStream floStream(&file);
QString line;
QTextCodec *codec=QTextCodec::codecForName("GBK");
floStream.setCodec(codec);

while ( floStream.atEnd()==0 )
{
line = codec->fromUnicode(floStream.readLine());
qWarning(line);
}
file.close();
}
return 0;
}
代码中的主要改动就是黄底的部分
意思就是创立一个中文GBK编码样式,然后按照这种方式来把读入的文件流进行重新编码,这样中文就可以顺利输出了。

补上这两句就可以了显示中文了
#include <qtextcodec.h>
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")) ;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用Qt中的QFileQTextStream类将QString写入文件,可以按照以下步骤进行操作: 1. 首先,包含必要的头文件,如QFileQTextStreamQTextCodec。例如: ``` #include <QFile> #include <QTextStream> #include <QTextCodec> ``` 2. 创建一个QFile对象并指定文件路径。例如: ``` QFile file("D:/Qt.txt"); ``` 3. 打开文件以进行写入,使用QIODevice::ReadWrite和QIODevice::Text参数。例如: ``` file.open(QIODevice::ReadWrite | QIODevice::Text); ``` 4. 将要写入的QString内容转换为QByteArray格式,以便写入文件。可以使用QString的toUtf8()方法进行转换。例如: ``` QString content = "写入文件的内容"; QByteArray str = content.toUtf8(); ``` 5. 使用QTextStream对象将转换后的内容写入文件。例如: ``` QTextStream stream(&file); stream << str; ``` 6. 关闭文件。例如: ``` file.close(); ``` 这样,你就成功将QString写入文件了。如果文件已经存在,可以通过判断文件是否存在来避免覆盖原文件。如果文件已经存在,可以选择是否进行覆盖操作。例如: ``` if (file.exists()) { QMessageBox::warning(this, "创建文件", "文件已经存在!"); } else { // 文件不存在,进行写入操作 // ... } ``` 如果你想修改已经存在的文件,可以先打开文件并读取其内容,然后再进行修改并保存。你可以使用类似以下的代码: ``` // 打开文件并读取内容 QFile file("D:/Qt.txt"); file.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream ts(&file); QString str_get = ts.readAll(); file.close(); // 进行修改并保存 file.open(QIODevice::ReadWrite | QIODevice::Text); QByteArray strb = str_get.toUtf8(); file.write(strb); file.close(); ``` 请注意,这只是一个示例,你可以根据实际需求进行修改和适应。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Qt文件操作详解(创建、写入、删除、INI、XML文件等)](https://blog.csdn.net/qq_40194498/article/details/79726388)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值