(二十)文本流与数据流

Qt中将文件类型分为2大类:

1、文本文件:文件的内容是可读的文本字符

2、数据文件:文件内容是直接的二进制数据

 

QFile类直接支持文本文件和数据文件的读写(通过继承自QIODevice的成员函数)

qint64

read ( char * data, qint64 maxSize )

QByteArray

read ( qint64 maxSize )

qint64

write ( const char * data, qint64 maxSize )

qint64

write ( const char * data )

qint64

write ( const QByteArray & byteArray )

但是有时候需要需要进行类型的转换

 

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDebug>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   QFile file("C:/Users/hp/Desktop/test.hex"); 
 
   if( file.open(QIODevice::WriteOnly) )       //未指定QIODevice::Text方式,用二进制的方式打开文件
    {
       QString hi = "Good Evening";
       double value = 3.14;
                                                       
       file.write(hi.toStdString().c_str()); //函数参数类型为const char*类型,因此将dt转为标准字符串(C++中的string),再取C风格字符串指针
       file.write(reinterpret_cast<char*>(&value), sizeof(value));
 
       file.close();
    }
 
   if( file.open(QIODevice::ReadOnly) )
    {
       QString hi = "";
       double value = 0;
 
       hi = QString(file.read(12));                
                            //注意!!此处读取的长度一定不能包含'\0' 不能通过sizeof("Goodevening ")的方式指定读取长度,必须读取确实有效的数据,包含'\0'后会读取出怪异的符号
 
       file.read(reinterpret_cast<char*>(&value), sizeof(value));   
 
       file.close();
 
       qDebug() << hi;
       qDebug() << value;
    }
   
   return a.exec();
}


 

文本流与数据流

Qt提供了辅助类简化了文本文件/数据文件的读写

1、QTextStream写入的数据全部转换为可读文本

2、QDataStream写入的数据根据类型转换为二进制数据

 

I/O设备辅助类的使用方式

//1.创建QFile文件对象(如:file)
//2.使用file对象打开文件
 
//3.将数据写入文件
QxxxStream out(&file);
 
out << QString("xxx");
out << QString("Result: ")<< 3.14;
 
//4.将数据从文件中读出
QxxxStream in(&file);
 
in >> dt;     //dt须声明为QString类型;
in >> result;  //result须声明为QString;
in >> value;  //value声明为double;

 

对于QTextStream:

1、QTextStream可以读写所有文本格式的文件,比如纯文本文件、HTML文件、XML文件

2、QTextStream考虑了Unicode编码与系统本地编码或其他任意编码之间的转换问题,并且处理了不同操作系统换行符的问题

3、QTextStream的读取与写入字符串的问题,如:

QTextStream out(&file); 
out << “Good” << “Evening”;
QTextStream in(&file);
QString str1, str2;
In >> str1 >> str2;

这里,实际写入到out中的字符串为”GoodEvening”,并且在读取时,str1获得了整个字符串”GoodEvening”,str2什么也读取不到,QTextStream内部维护了一个Unicode的缓冲区。因此我们在读取字符串时一般使用

QString

readLine ( qint64 maxlen = 0 )

QString

readAll ()

整块整块的读取内容

也有其他的办法:

1)、以单词的形式读取,可以一次性写入一长串的字符串,字符串内的单词必须由空格分开(前导空格会被忽略),读取时以QString的形式读取,一个QString只能读到一个单词

如:

out <<“Good Evening”;      
in >> str1 >> str2;//QString对象str1读取到Good,str2读取到Evening

2)、以字符的形式读取,不管怎么写入,一次只读取一个字符

如:

out << “Good Evening”;      
while(!in.atEnd())
{	in>> a; 
	//接着处理字符a
} 

可通过成员函数

void

skipWhiteSpace ()

跳过空格,以字符读取的形式经常在解析文件,使用独立的字符编码时方便输入处理

 

4、默认情况下QTextStream使用系统本地编码,可通过成员函数

void

setCodec ( QTextCodec * codec )

void

setCodec ( const char * codecName )

指定编码

5、QTextStream拥有流操作器Manipulator(放在输出内容前)或一些成员函数用于格式化输出(具体参考帮助文档),如:

 out << showbase << uppercasedigits << hex<< 12345678; 

out.setNumberFlags(QTextStream::ShowBase |QTextStream::UppercaseDigits); 
out.setIntegerBase(16); 
out << 12345678;

操作后生成的实际输出文本为0xBC614E

 

对于QDataStream:

不同Qt版本的数据流文件格式可能不同,读写文件时需要设置版本号

void

setVersion ( int v )

int

version () const

 

#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); 
 
       out << QString("Good Evening ") << endl;       
       out << QString("Result: ") << endl;           //输出"Result:"
       out << 5 << '*' << 6 << '=' << 5 * 6<< endl;//输出5*6=30到文本文件中
                  
       file.close();                                                              
    }
 
   if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
    {
       QTextStream in(&file);
 
       while( !in.atEnd() )  
       {
           QString line = in.readLine();     //每次在in中读取一行
           qDebug() << line;    
       }
 
       file.close();                                                     
    }
}
 
void data_stream_test(QString f)
{
   QFile file(f);
 
   if( file.open(QIODevice::WriteOnly) )      
    {
       QDataStream out(&file);                  
 
       out.setVersion(QDataStream::Qt_4_7); //读写之前设置版本号
 
       out << QString("Good Evening ");   
       out << QString("Result: ");
       out << 3.14;
 
       file.close();      
    }
 
   if( file.open(QIODevice::ReadOnly) )
    {
       QDataStream in(&file);
       QString dt = "";
       QString result = "";
       double value = 0;
 
       in.setVersion(QDataStream::Qt_4_7);             //读写之前设置版本号
 
       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("C:/Users/hp/Desktop/text.txt");    
   data_stream_test("C:/Users/hp/Desktop/data.dat");
   
   return a.exec();
}


 

声明:
此文根据 狄泰学院唐老师的《QT实验分析教程》创作

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值