zoukankan      html  css  js  c++  java
  • QT输入输出(一) 之 QDataStream 测试

    QT提供了两个高级别的流类---QDataStream和QTextStream,可以从任意的输入输出设备读取或写入数据。

    QDataStream用于读写二进制数据,它的优点是:在读写数据的时候已经严格定义了数据流的类型和每个类型的长度,这样就不用关心编码之间转换的问题了。

    QTextStream用于读写文本(如HTML、XML和源代码等)的格式,解决了二进制文件格式无法直接阅读和编辑的缺点。QTextStream考虑了Unicode编码与系统本地编码或其他编码之间的转换问题,并考虑了不同操作系统之间行尾符切换的问题(MS “ ”, Mac “ ”)。

    QTextStream使用16位的QChar类型作为基本数据单元,并支持数字类型和字符串类型的转换。


    现在先对QDataStream测试:


    (一)先看测试代码

    #include <QCoreApplication>
    #include<QDataStream>
    #include<QFile>
    #include<QHash>
    #include<iostream>
    #include<QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
    QHash<int, QString> hash;
    hash.insert(0, "working");
    hash.insert(1, "hard");
    hash.insert(2, "!");
    QString str("this is a QDataStream test  ");
    QFile file("test.dat");
    if(!file.open(QIODevice::WriteOnly))
    {
        std::cerr<<"can not open file test.dat:"<<qPrintable(file.errorString())<<std::endl;
       // return;
    }
    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_4_3);
    out<<quint32(0x12345678)<<str<<hash;
    
    if(!file.flush())
    {
        qDebug("write faile");
    }
    
    
    QFile file_in("test.dat");
    if(!file_in.open(QIODevice::ReadOnly))
    {
         std::cerr<<"can not open file test.dat:"<<qPrintable(file.errorString())<<std::endl;
    
    }
    QDataStream in(&file_in);
    in.setVersion(QDataStream::Qt_4_3);
    quint32 c;
    QHash<int, QString> b;
    QString str1;
    in>> c >> str1 >> b;
    qDebug()<<c <<endl<<str1<<endl;
    QHash<int, QString>::const_iterator j;
    for(j = b.constBegin(); j != b.constEnd(); j++)
    qDebug()<<j.key()<<"  "<<j.value()<<endl;
    
    
        return a.exec();
    }
    


    (二)测试结果


    (三)总结

    1、

    std::cerr<<"cannotopenfiletest.dat:"<<qPrintable(file.errorString())<<std::endl;
    才用标准错误输出,qPrintable()函数将QString转换为C++标准的 const char* 字符串。
    也可采用QString.toStdString(),返回C++ string类型。
    2、
    由于QT中不同版本有不同的QT数据类型的表示方式,所以在输入输出时最好设置统一的版本号(版本号是一个整数),保持存储、接收数据的一致性。
    out.setVersion(QDataStream::Qt_4_3);
    in.setVersion(QDataStream::Qt_4_3);
    3、
    QDataStream默认采用大端(big-endian)方式存储32位整数,所以为了在所有平台上确保0x12345678表示的都是32位无符号数,采用了quint的强制类型转换
    
    
    quint32(0x12345678)
    4、
    if(!file.flush())
    {
        qDebug("write faile");
    }
    在《C++ GUI QT 4》中,没有加入这一句,所以会出现数据无法写入文件的问题,当然也无法读到数据。是因为,写操作是把数据写到缓冲区,交给操作系统完成写到文件的任务,但是操作系统是多任务的,不会立即把缓冲区的数据写到文件,所以最好强制把缓冲区的数据写到文件。
     
    
    
    
  • 相关阅读:
    MVC Web Api 发布到Azure报错
    WCF Rest post请求
    CRM2011部署问题小结
    CRM 2011 开发中遇到的问题小结
    SQL Server 2012 从备份中还原数据库
    Spring注解@Resource和@Autowired区别对比(转)
    synchronized 锁的是方法还是对象还是类?测试实例
    Java经典死锁范例
    java的单例模式,为什么需要volatile(转)
    Windows自动上传,并执行Linux指定shell文件
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3503040.html
Copyright © 2011-2022 走看看