33_文本流和數據流

關鍵詞:Qt中文件類型、

1. 文件類型

  • Qt中文件類型分為兩大類
    1) 文本文件:文件內容是可讀的文本字符
    2)數據文件:文件內容是直接的二進制數據

  • QFile直接支持文本文件數據文件的讀寫

qint64 read(char* data, qint64 maxSize);    
QByteArray read(qint64 maxSize);
qint64 write(const char* data, qint64 maxSize);
qint64 write(const QByteArray& byteArray);

思考:如何將一個浮點數據寫入文本文件數據文件峻贮?

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDebug>

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("/home/delphi/QT/IOFile/test.hex");

    if( file.open(QIODevice::WriteOnly) )   // 以只寫的方式以及二進制的形式打開文件
    {
        QString dt = "D.T.Software";
        double value = 3.14;

        file.write(dt.toStdString().c_str());   // 將QString 轉換為 二進制數據
        file.write(reinterpret_cast<char*>(&value), sizeof(value)); // 將 double* 轉化為 char*

        file.close();
    }

    if( file.open(QIODevice::ReadOnly)) // 以只讀的方式以及二進制的形式打開文件
    {
        QString dt = "";
        double value = 0;

        dt = QString(file.read(12));
        file.read(reinterpret_cast<char*>(&value), sizeof(value));

        file.close();

        qDebug() << dt;
        qDebug() << value;
    }

    return a.exec();
}

2. 文本流和數據流

  • Qt提供輔助類簡化了文本文件數據文件的讀寫
    1) QTextStream:寫入的數據全部轉化為可讀文本
    2) QDataStream:寫入的數據根據類型轉化為二進制數據
  • IO設備輔助類的使用方式
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDataStream>
#include <QDebug>

void text_stream_test(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::WriteOnly | QIODevice::Text) ) // 以只寫和文本形式打開文件
    {
        QTextStream out(&file);     // 創(chuàng)建 QTextStream 輔助類

        out << QString("D.T.Software") << endl;     // 通過輔助類輸入字符串
        out << QString("Result: ") << endl;
        out << 5 << "*" << 6 << " = " <<  5 * 6 <<endl; // 通過輔助類輸入表達式

        file.close();
    }

    if( file.open(QIODevice::ReadOnly | QIODevice::Text))   // 以只寫和文本形式打開文件
    {
        QTextStream in(&file);  // 創(chuàng)建 QTextStream 輔助類

        while( !in.atEnd() )
        {
            QString line = in.readLine();

            qDebug() << line;
        }

        file.close();
    }
}

void data_stream_text(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::WriteOnly) ) // 以只寫和二進制形式打開文件
    {
        QDataStream out(&file);     // 創(chuàng)建 QDataStream 輔助類

        out << QString("D.T.Software");     // 通過輔助類輸入字符串
        out << QString("Result: ");
        out << 3.14; // 通過輔助類輸入表達式

        file.close();
    }

    if( file.open(QIODevice::ReadOnly))   // 以只寫和二進制形式打開文件
    {
        QDataStream in(&file);  // 創(chuàng)建 QDataStream 輔助類

        QString dt = "";
        QString result = "";
        double value = 0;

        in >> dt;
        in >> result;
        in >> value;

        file.close();

        qDebug() << dt;
        qDebug() << result;
        qDebug() << value;
    }
}


int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    text_stream_test("/home/delphi/QT/IOFile/result.txt");
    data_stream_text("/home/delphi/QT/IOFile/result.dat");

    return a.exec();
}

3. 數據流文件的版本信息

NOTE: 當數據流文件可能在不同版本的Qt程序間傳遞數據時竖幔,需要考慮版本問題I侗妗=榉怠!

  • 不同Qt版本的數據流文件格式可能不同
void setVersion(int v);       // 設置讀寫版本號
int version() const;          // 獲取讀寫版本號

4. 小結

  • Qt中的文件輔助類用于方便讀寫操作
  • QTextStream用于文本數據的快速讀寫
  • QDataStream用于二進制數據的快速讀寫
  • QDataStream的文件格式與Qt版本相關
  • 數據格式文件在程序間傳遞時蒋伦, 需要考慮版本問題

聲明:此文章僅是本人在學習狄泰QT實驗分析課程所做的筆記弓摘,文章中包含狄泰軟件資料內容,一切版權歸狄泰軟件所有痕届!
實驗環(huán)境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末韧献,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子研叫,更是在濱河造成了極大的恐慌锤窑,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚷炉,死亡現場離奇詭異渊啰,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門绘证,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隧膏,“玉大人,你說我怎么就攤上這事嚷那“恚” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵魏宽,是天一觀的道長腐泻。 經常有香客問我,道長队询,這世上最難降的妖魔是什么派桩? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮娘摔,結果婚禮上窄坦,老公的妹妹穿的比我還像新娘。我一直安慰自己凳寺,他們只是感情好鸭津,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肠缨,像睡著了一般逆趋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晒奕,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天闻书,我揣著相機與錄音,去河邊找鬼脑慧。 笑死魄眉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的闷袒。 我是一名探鬼主播坑律,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼囊骤!你這毒婦竟也來了晃择?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤也物,失蹤者是張志新(化名)和其女友劉穎宫屠,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體滑蚯,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡浪蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乌逐。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡竭讳,死狀恐怖,靈堂內的尸體忽然破棺而出浙踢,到底是詐尸還是另有隱情绢慢,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布洛波,位于F島的核電站胰舆,受9級特大地震影響,放射性物質發(fā)生泄漏蹬挤。R本人自食惡果不足惜缚窿,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望焰扳。 院中可真熱鬧倦零,春花似錦、人聲如沸吨悍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽育瓜。三九已至葫隙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躏仇,已是汗流浹背恋脚。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焰手,地道東北人糟描。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像书妻,于是被迫代替她去往敵國和親蚓挤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容