• <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>

            程序讓生活更美好

            半畝方塘 天光云影

              C++博客 ::  :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
              55 隨筆 :: 4 文章 :: 202 評論 :: 0 Trackbacks
               雖然C++標(biāo)準(zhǔn)中有了文件讀取的相關(guān)類,也很好用,但是在涉及到QT編程的時候卻用起來不方便了,因為QT本身很多組件都是關(guān)聯(lián)的自身的QString類型的字符串,所以再用C++本身String類型的時候就不是那么方便了,需要進行轉(zhuǎn)化,這樣給程序帶來了復(fù)雜度,同時也帶來了轉(zhuǎn)化的開銷,所以如果用QT開發(fā),可以就用它本身所帶的這些類型進行處理,形成一個系統(tǒng),便于數(shù)據(jù)在程序之中的交互和共用。
               QT很好,但是在處理中文或者其他語言的時候要注意編碼格式,如果沒有注意,讀取文件的時候可能讀出來的就是亂碼或者干脆程序就死掉了,這是我們所不愿意看到的,下面就講講怎么樣通過QT的類來讀取中文文件。


            介紹部分
               我們需要用到幾個頭文件中的類:
            #include <qstring.h>
            #include <qfile.h>
            #include <qtextstream.h>
            #include <qtextcodec.h>

            QString

            QString類提供了一個Unicode文本和經(jīng)典的C以零結(jié)尾的字符數(shù)組的抽象。
            QString使用隱含共享,這使它非常有效率并且很容易使用。
            所有的QString的方法都使用const char *參數(shù),const char *被解釋為經(jīng)典的C風(fēng)格的以零結(jié)尾的ASCII字符串。所以const char *參數(shù)為0是合法的。如果const char *不是以零結(jié)尾的,結(jié)果是不確定的。把經(jīng)典的C字符串復(fù)制到QString的函數(shù)將不會復(fù)制結(jié)尾的0字符。QString的QChar數(shù)組(可以通過unicode()返回)通常不以零結(jié)尾。如果你需要把QString傳遞到一個需要C的以零結(jié)尾的字符串,請使用latin1()。
            沒有分配任何東西的QString是零,也就是長度和數(shù)據(jù)指針都為0。引用空字符串(“”,一個單一的'\0'字符)的QString是空。零和空這兩個QString在方法中都是合法的。把(const char *) 0賦值給QString給定了一個零QString。為了方便,QString::null是一個零QString。當(dāng)排序的時候,空字符串在最前面,然后是非空字符串,然后才是零字符串。我們建議使用if ( !str.isNull() ),而不是if ( !str )來檢測非零字符串,關(guān)于解釋說明也可以參考o(jì)perator!()。
            注意如果你發(fā)現(xiàn)你正在混合使用QCString、QString和QByteArray,這將會導(dǎo)致很多不必要的復(fù)制并且也許會預(yù)示著你正在處理的真實自然數(shù)據(jù)是不確定的。如果數(shù)據(jù)是以零結(jié)尾的八位數(shù)據(jù),請使用QCString;如果它是沒有結(jié)尾的(也就是包含0)八位數(shù)據(jù),請使用QByteArray;如果它是文本,請使用QString。
            字符串列表可以使用QStringList類來處理。你可以使用QStringList::split()來把一個字符串分割為一個字符串列表,并且可以使用QStringList::join()把一個字符串列表連接成一個使用隨意間隔符的字符串。你也可以使用QStringList::grep()從一個字符串列表中獲得包含特定子字符串或者包含匹配特定的regex的字符串列表。
            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            QFile

            QFile類是一個操作文件的輸入/輸出設(shè)備。
            QFile是用來讀寫二進制文件和文本文件的輸入/輸出設(shè)備。QFile可以自己單獨被使用,但是如果和QDataStream或QTextStream一起使用將更加方便。
            文件名通??梢酝ㄟ^構(gòu)造函數(shù)來傳遞,但也可以使用setName()來設(shè)置。你可以通過exists()來檢查一個文件是否存在并且可以通過remove()來移去一個文件。
            文件可以用open()來打開、用close()來關(guān)閉、用flush()來刷新。數(shù)據(jù)通??梢允褂肣DataStream或者QTextStream進行讀寫,但你也可以使用readBlock()和readLine()來讀,使用writeBlock()來寫。QFile也支持getch()、 ungetch()和putch()。
            size()可以返回文件的大小。你可以通過使用at()函數(shù)得到當(dāng)前文件位置或者移到一個新的文件位置。如果你到了文件的末尾,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();
                }
             
            寫文本也很容易(假設(shè)我們有一個行的字符串列表要寫):

                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讀寫文本的基本功能。
            文本流類的功能界面和標(biāo)準(zhǔn)的C++的iostream類非常相似。iostream和QTextStream的不同點是我們的流操作在一個很容易被繼承的QIODevice上,而iostream只能操作一個不能被繼承的FILE *指針。
            Qt提供了幾個和iostream相似的全局函數(shù):
            bin設(shè)置QTextStream來讀/寫二進制數(shù)字
            oct設(shè)置QTextStream來讀/寫八進制數(shù)字
            dec設(shè)置QTextStream來讀/寫十進制數(shù)字
            hex設(shè)置QTextStream來讀/寫十六進制數(shù)字
            endl強制換行
            flush強制QIODevice刷新任何被緩存的數(shù)據(jù)
            ws作為任何可用的控制符(在輸入的時候)
            reset重新設(shè)置QTextStream為它的缺省模式(請見reset())
            qSetW(int)設(shè)置字段寬度作為指定參數(shù)
            qSetFill(int)設(shè)置填充字符作為指定參數(shù)
            qSetPrecision(int)設(shè)置精確度作為指定參數(shù)
            警告:默認(rèn)情況下,QTextStream在讀取流的時候,會自動地檢測流中的數(shù)字是十進制、八進制、十六進制或者二進制格式。具體情況是,一個以“0”為開頭的數(shù)字是八進制的,比如順序為“0100”將會被解釋為64。
            QTextStream類讀寫文本,它不適合處理二進制數(shù)據(jù)(而QDataStream是適合的)。
            默認(rèn)情況下,輸出的是使用本地8位編碼后的Unicode文本(比如,QString)。這些可以使用setEncoding()方法進行改變。對于輸入,QTextStream會自動檢測標(biāo)準(zhǔn)Unicode“字節(jié)順序標(biāo)記的”文本文件,否則會使用本地8位編碼。
            QIODevice在構(gòu)造函數(shù)中被設(shè)置,或者之后在setDevice()中使用。如果輸入到達了atEnd(),返回真。數(shù)據(jù)可以使用operator>>()重載操作符讀到適當(dāng)類型的變量中,或者使用read()把它作為整個部分讀到一個單一的字符串中,或者使用readLine()把一次讀一行。使用skipWhiteSpace()可以忽略控制符。你可以使用flags()或setf()來設(shè)置流的標(biāo)記。這個流也支持width()、precision()和 fill(),使用reset()可以重新恢復(fù)默認(rèn)設(shè)置。
            也可以參考QDataStream、輸入/輸出和網(wǎng)絡(luò)和文本相關(guān)類.
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            QTextCodec

            QTextCodec 類提供文本編碼之間的轉(zhuǎn)換。
            QT使用Unicode來存儲,繪制以及操作字符串。在很多情況下,你可能想要使用不同的編碼方式來處理數(shù)據(jù)。例如大部分的日語文件都被存儲在Shift-JIS或者 ISO2022的文件中,而俄羅斯的用戶常常使用KOI8-R或者CP1251編碼方式。QT提供了一個QTextCodec 類集合來從Unicode格式轉(zhuǎn)化到相應(yīng)的格式。

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            代碼部分

            #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;
            }
            代碼中的主要改動就是黃底的部分
            意思就是創(chuàng)立一個中文GBK編碼樣式,然后按照這種方式來把讀入的文件流進行重新編碼,這樣中文就可以順利輸出了,不信你可以試一試,哈哈,先介紹這么多,下次有什么下次再寫啦。

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

            評論

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

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

            亚洲欧洲日产国码无码久久99| 久久精品视屏| 人妻少妇精品久久| 久久久久亚洲精品男人的天堂| 热久久视久久精品18| 久久婷婷色综合一区二区| 热久久视久久精品18| 亚洲国产精品一区二区久久hs| 久久精品无码一区二区三区| 四虎亚洲国产成人久久精品| 伊人久久久AV老熟妇色| 无码国内精品久久人妻蜜桃| 日本精品久久久久中文字幕8| 亚洲国产精品综合久久网络| 狠狠综合久久综合88亚洲| 日本免费一区二区久久人人澡| 久久精品亚洲AV久久久无码| 91超碰碰碰碰久久久久久综合 | 久久久精品国产Sm最大网站| 亚洲乱码日产精品a级毛片久久| 麻豆成人久久精品二区三区免费 | 亚洲国产高清精品线久久| 蜜臀av性久久久久蜜臀aⅴ| 久久99精品久久久久久野外| 国产精品一久久香蕉国产线看观看 | 四虎国产精品免费久久| 午夜精品久久久久久99热| 99久久99久久精品国产片| 亚洲精品无码久久一线| 国产精品99久久精品爆乳| 日韩精品无码久久久久久| 欧美日韩精品久久久免费观看| 无码精品久久一区二区三区| 狠狠色综合久久久久尤物| 国内精品久久久久久久97牛牛| 久久无码人妻一区二区三区午夜| 久久精品亚洲AV久久久无码| 精品久久久久一区二区三区| 久久精品一区二区影院| 91精品久久久久久无码| 国产精品欧美久久久久无广告|