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 ;
}
{
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 ;
}
{
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; }