>> QT读取中文文件
-
固然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编码样式,然后依照这种方法来把读进的文件流进行重新编码,这样中文就可以顺利输出了,不信你可以试一试,哈哈,叫我玲子,先先容这么多,下次有什么下次再写啦。
