Qt QT的IO流 QT輸入輸出


1. QFile QDataStream 讀寫文件  二進制讀寫文件

#include <QApplication>
#include <QtGui>
#include <QtDebug>

int main(int argc, char *argv[])
{
    QMap<QString, QColor> map;
    map.insert("red", Qt::red);
    map.insert("green", Qt::green);
    map.insert("bule", Qt::blue);

    QFile file("123.txt");
    if( !file.open(QIODevice::WriteOnly) )
        qDebug() << "open file fail";

    QDataStream out(&file);
    out.setVersion(9);
    out << quint32(0x12345678) << map;
}
#include <QApplication>
#include <QtGui>
#include <QtDebug>
#include <iostream>

int main(int argc, char *argv[])
{
    QFile file("123.txt");
    if( !file.open(QIODevice::ReadWrite) )
        qDebug() << "open file fail";

    QDataStream in(&file);
    in.setVersion(9);
    QString str1, str2;
    in >> str1 >> str2;

    qDebug() << str1 << str2;
}


2. QDataStream實例  -- 《轉載》http://blog.csdn.net/Last_Impression/article/details/2418878

我們使用自定義的二進制格式來實現Spreadsheet文件的保存和讀取。我們用QFile和QDataStream這兩個類來實現,它們一起提供了平台無關的二進制I/O。
首先是保存文件的代碼:
bool  Spreadsheet::writeFile( const  QString  & fileName)
{
    QFile file(fileName);
    
if  ( ! file.open(QIODevice::WriteOnly)) {
        QMessageBox::warning(
this , tr( " Spreadsheet " ),
                             tr(
" Cannot write file %1: %2. " )
                             .arg(file.fileName())
                             .arg(file.errorString()));
        
return   false ;
    }
    QDataStream 
out ( & file);
    
out .setVersion(QDataStream::Qt_4_1);
    
out   <<  quint32(MagicNumber);
    QApplication::setOverrideCursor(Qt::WaitCursor);
    
for  ( int  row  =   0 ; row  <  RowCount;  ++ row) {
        
for  ( int  column  =   0 ; column  <  ColumnCount;  ++ column) {
            QString str 
=  formula(row, column);
            
if  ( ! str.isEmpty())
                
out   <<  quint16(row)  <<  quint16(column)  <<  str;
        }
    }
    QApplication::restoreOverrideCursor();
    
return   true ;
}
函數writeFile()由MainWindow::saveFile()調用,把文件保存到磁盤上。如果保存成功返回true,否則返回false。
首先我們使用給定的程序名創建一個QFile對象,調open()打開這個文件准備寫入。同時創建一個QDataSteam對象來操作QFile對象,將數據寫入文件中。
在寫數據之前,我們將程序的光標換成等待形式,數據寫完后恢復原來的鼠標形狀。函數結束時,QFile的析構函數把文件自動關閉。
QDataStream支持基本的C++類型,也支持多種Qt類型。語法和標准C++<iostream>類是一樣的。例如:
Out<<x<<y<<z;把變量x,y,z寫入數據流。
In>>x>>y>>z; 從數據流中讀取數據到x,y,z中。在不同的平台上,基本的C++類型如short,char,int,long,long long會有不同的字長。最好把它們轉換為qint8,quint8,qint16,quint16,qint32,quint32,qint64,quint64,這些類型能確保字長是不隨平台改變的。
Spreadsheet程序的文件格式非常簡單。一個Spreadsheet文件開頭部分是一個32位的標識數字(MagciNumber,在spreadsheet.h中定義的,一個二進制的隨機數),這個數字后面是一系列的數據塊,包括一個單元格的行號,列號和公式組成。為了節省空間,不保存空的單元格。
數據類型的二進制表示由類QDataStream決定。如:quint16表示按big-endian順序保存為兩個字節。一個QString類型表示是字符串的長度后面接着Unicode碼組成。
自Qt1.0以來,Qt數據類型的二進制表示有了很大變化。在未來的Qt版本中還可能有更多的改變,默認QDataStream使用最近的Qt版本的二進制格式(version 7 in Qt 4.1),但是它可以讀取以前的版本。為了程序用新的Qt版本重新編譯后能夠更好的兼容,我們顯式的給出QDataStream使用的版本為7(QDataStream::Qt_4_1定義為常量7)
QDataStream可以支持多種類型。如QFile,QBuffer,QProcess,QTcpSocket或者QUdpSocket。Qt還提供了類QTextStream能夠讀寫文本文件。第12章詳細介紹這些類。
讀取文件如下:
bool  Spreadsheet::readFile( const  QString  & fileName)
{
    QFile file(fileName);
    
if  ( ! file.open(QIODevice::ReadOnly)) {
        QMessageBox::warning(
this , tr( " Spreadsheet " ),
                             tr(
" Cannot read file %1: %2. " )
                             .arg(file.fileName())
                             .arg(file.errorString()));
        
return   false ;
    }
    QDataStream 
in ( & file);
    
in .setVersion(QDataStream::Qt_4_1);
    quint32 magic;
    
in   >>  magic;
    
if  (magic  !=  MagicNumber) {
        QMessageBox::warning(
this , tr( " Spreadsheet " ),
                             tr(
" The file is not a Spreadsheet file. " ));
        
return   false ;
    }
    clear();
    quint16 row;
    quint16 column;
    QString str;
    QApplication::setOverrideCursor(Qt::WaitCursor);
    
while  ( ! in .atEnd()) {
        
in   >>  row  >>  column  >>  str;
        setFormula(row, column, str);
    }
    QApplication::restoreOverrideCursor();
    
return   true ;
}
 
函數readFile()和writeFile()很相似。這次文件的打開方式為QIODevice::ReadOnly而不是QIODevice::writeOnly。設置QDataStream的版本為7。寫文件和讀文件的版本必須一致。
如果文件的magic number號是正確的,調用clear()清空所有的表格,因為文件中只是保存了非空的單元格數據,不能保證所有的單元格都會被設置,所以必須確保再讀取單元格數據前所有的表格要清空。

 

3. QTextStream 文件讀寫

#include <QApplication>
#include <QtGui>
#include <QtDebug>
#include <iostream>

int main(int argc, char *argv[])
{
    QFile file("456.txt");
    if( !file.open(QIODevice::ReadWrite) )
        qDebug() << "open file fail";
    QTextStream out(&file);
    out << "1234" << endl <<"5678" << endl;
    file.close();

    if( !file.open(QIODevice::ReadWrite) )
        qDebug() << "open file fail";
    QTextStream in(&file);
    QString str1, str2;
    str1 = in.readLine();
    in >> str2;
    qDebug() << str1 << str2;
}


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM