青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

程序讓生活更美好

半畝方塘 天光云影

  C++博客 ::  :: 新隨筆 :: 聯系 ::  :: 管理 ::
  55 隨筆 :: 4 文章 :: 202 評論 :: 0 Trackbacks
   雖然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()來刷新。數據通??梢允褂肣DataStream或者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編碼樣式,然后按照這種方式來把讀入的文件流進行重新編碼,這樣中文就可以順利輸出了,不信你可以試一試,哈哈,先介紹這么多,下次有什么下次再寫啦。

posted on 2007-08-25 20:28 北風之神007 閱讀(16232) 評論(2)  編輯 收藏 引用 所屬分類: QT

評論

# re: QT讀取中文文件 2007-10-18 14:13 qt
用qt4來解析帶有中文的xml,中文顯示不對,如何解決.
  回復  更多評論
  

# re: QT讀取中文文件 2013-10-16 14:08 愛情不是買賣三妹
幫幫我??!  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性欧美1819sex性高清| 亚洲一区二区三区免费观看| 亚洲精品系列| 日韩午夜av| 国产亚洲欧美日韩日本| 国产精品一区二区在线观看| 国产精品久久综合| 国产色综合网| 亚洲激情专区| 在线视频欧美日韩| 久久高清国产| 美女视频黄 久久| 午夜精品国产| 亚洲美女淫视频| 欧美激情视频一区二区三区不卡| 欧美国产国产综合| 亚洲理论在线| 欧美在线观看视频一区二区| 狼人天天伊人久久| 欧美三级电影精品| 国产视频精品xxxx| 亚洲欧洲在线看| 欧美亚洲免费高清在线观看| 免费视频一区| 一区二区不卡在线视频 午夜欧美不卡在 | 中文欧美在线视频| 久久国产黑丝| 亚洲人成在线观看一区二区| 亚洲精品国产日韩| 久久久99国产精品免费| 欧美日韩在线高清| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲一区二区三区视频| 欧美电影免费观看高清| 亚洲一级一区| 欧美日韩妖精视频| 亚洲国产精品va在线观看黑人| 亚洲一区欧美激情| 欧美国产日本韩| 久久成人免费| 国产精品视频一二三| 99精品国产一区二区青青牛奶| 久久亚洲一区二区| 午夜精品久久久久久久99樱桃| 欧美日韩免费观看中文| 亚洲国产一区二区a毛片| 久久久精品tv| 亚洲一区二区在线视频| 欧美视频第二页| 日韩视频永久免费| 亚洲国产福利在线| 免费视频久久| 亚洲国语精品自产拍在线观看| 久久免费99精品久久久久久| 在线一区欧美| 国产精品成人一区二区网站软件| 亚洲免费观看高清在线观看| 欧美成人综合网站| 久久精品五月| 欧美一区二区三区四区在线观看| 亚洲丰满在线| 久久久久久伊人| 亚洲一区二区在线播放| 国产精品盗摄久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 91久久国产综合久久蜜月精品| 欧美不卡在线| 亚洲另类黄色| 99国内精品久久| 国产精品黄视频| 欧美在线视频免费观看| 性久久久久久久久| 国产亚洲欧美一区在线观看| 久久精品国产免费观看| 久久精品国产91精品亚洲| 黑人操亚洲美女惩罚| 美女精品在线观看| 欧美高清视频免费观看| 亚洲视频在线观看视频| 亚洲午夜一区二区| 国产日韩欧美成人| 欧美电影免费观看网站| 欧美久久久久久蜜桃| 亚洲欧美日韩在线| 欧美在线精品免播放器视频| 亚洲国产精品一区制服丝袜| 亚洲欧洲在线播放| 国产精品久久二区二区| 久久久一二三| 欧美韩日精品| 先锋影音久久久| 久久综合999| 亚洲一区自拍| 久久久蜜桃一区二区人| 一区二区三区四区五区精品| 欧美一区高清| 一本色道久久88综合日韩精品 | 亚洲影音一区| 亚洲国产精品日韩| 亚洲综合首页| 亚洲欧洲精品天堂一级 | 欧美精品三级在线观看| 亚洲欧美日韩精品一区二区| 久久视频一区| 欧美诱惑福利视频| 欧美激情综合五月色丁香| 久久黄金**| 欧美日韩直播| 欧美福利在线| 韩国精品在线观看| 中文网丁香综合网| 亚洲人成在线播放网站岛国| 午夜精品久久久久久久99樱桃 | 狠狠综合久久| 亚洲尤物在线视频观看| 日韩亚洲精品视频| 久久青草久久| 久久精品视频播放| 国产精品乱码一区二区三区| 激情一区二区| 欧美成人激情视频| 国产精品永久免费观看| 亚洲最新在线| 99re66热这里只有精品4| 久久久久久亚洲精品杨幂换脸| 亚洲欧洲99久久| 欧美性猛交xxxx乱大交退制版| 亚洲黄色毛片| 亚洲韩国精品一区| 免费观看在线综合| 免费日韩av电影| 亚洲国产精品va在线观看黑人| 欧美在线观看视频一区二区| 久久成人精品视频| 国产麻豆日韩欧美久久| 国产精品99久久99久久久二8| 99国内精品久久| 欧美日韩国产bt| 日韩午夜免费| 亚洲淫片在线视频| 国产精品日韩精品欧美精品| 亚洲一区二区在线免费观看| 久久国产精品色婷婷| 国产欧美午夜| 久久久久国产精品一区三寸| 免费不卡在线视频| 91久久在线视频| 欧美日韩蜜桃| 亚洲欧美一区二区在线观看| 久久精品国产清高在天天线 | 国产亚洲aⅴaaaaaa毛片| 欧美一区二粉嫩精品国产一线天| 久久岛国电影| 1024国产精品| 美日韩丰满少妇在线观看| 亚洲人成毛片在线播放女女| 亚洲狼人精品一区二区三区| 欧美视频国产精品| 欧美中文字幕精品| 你懂的视频一区二区| 夜久久久久久| 国产日韩欧美在线一区| 久久久久一区二区三区四区| 亚洲国产欧美日韩精品| 亚洲男人的天堂在线aⅴ视频| 国产女主播一区二区| 久久五月婷婷丁香社区| 日韩午夜精品| 久久中文在线| 亚洲一区二区三区777| 国产午夜精品理论片a级探花| 久久综合精品国产一区二区三区| 亚洲欧洲综合| 久久婷婷综合激情| 亚洲天堂av图片| 一区二区在线视频观看| 欧美精品aa| 欧美中文字幕久久| 亚洲作爱视频| 牛牛精品成人免费视频| 亚洲欧美区自拍先锋| 亚洲福利免费| 国产精品一区二区黑丝| 欧美激情综合色| 久久九九精品99国产精品| 一区二区三区精品视频在线观看| 久久综合导航| 午夜一区二区三区在线观看| 亚洲精品国产精品乱码不99按摩| 欧美一区成人| 国产精品一区二区视频| 午夜精品国产更新| 亚洲精品美女在线观看| 国产精品视频区| 欧美激情第1页| 一本综合久久| 在线观看福利一区| 国产一区二区三区精品欧美日韩一区二区三区| 久久在线免费| 欧美亚洲综合久久|