Qt输入输出

QIODevice类是对所有读和写一段字节块的一个抽象。Qt包含了下面的一些子类:

QFile

访问本地文件系统中的文件或嵌入的资源。

QTemporaryFile

创建或访问本地文件系统中的临时文件。

QBuffer

从一个QByteArrary中读数据或将数据写入到一个QByteArray中。

QProcess

运行外部程序并处理进程间的通信。

QTcpSocket

使用TCP协议传输一个数据流。

QUdpSocket

通过网络发送或接收UDP数据流。

其中,QProcess,QTcpSocket,QUdpSocket是顺序文件,只能顺序访问,而QFile,QTemporaryFile, QBuffer是随机访问文件,可随机访问,可使用QIODevice::seek()来重定位文件指针。

另外,Qt也提供了两个更高级的流处理类,可用于向任何QIODevice设备中读或写数据。其中QDataStream用于读写二进制数据,而QTextStream用于读写文本数据。

读写文本

QTextStream负责处理Unicode与系统本地编码格式或任何其他编码格式的转换。QTextStream使用16-位的QChar类型作为数据的基本单元。另外,QTextStream也支持c++的基本数据类型。

使用例子如下所示:

QFile file("sf-book.txt");
if (!file.open(QIODevice::WriteOnly)) {
    cerr << "Cannot open file for writing: "
         << qPrintable(file.errorString()) << endl;
    return;
}
QTextStream out(&file);
out << "Thomas M. Disch: " << 334 << endl;

注意:写数据可能要容易些,但读数据就要复杂些,如

out<< "Norway" << "Sweden";如果使用in>> str1 >> str2;读的话,结果却是str1=”NorwaySweden”,而str2为空。因此,读数据必须使用专门的程序解析,QTextStream可以逐字符(QChar)地读取。

可以设置字符编码,如:

stream.setCodec("UTF-8");


QTextStream也支持一些流操作标志,如:

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

out.setNumberFlags(QTextStream::ShowBase

|QTextStream::UppercaseDigits);

out.setIntegerBase(16);

out<< 12345678;


读写二进制文件

QDataStream用于读写原始数据文件。在读写文件中,主要涉及两个问题:1.数据类型大小。2.Qt版本。

数据类型问题:确保读和写使用相同的数据类型。比如,对于整数,最好使用qint8,qint16qint32qint64,它们对于不同平台,数据类型大小都是一样的。避免使用int, short , long等数据类型,它们在不同平台上大小可能不同。

Qt版本:不同的Qt版本使用的二进制数据的编码可以不同。

QDataStream可序列化所有基本的C++类型和大部分Qt类型,如QColor,QList, QString等。要使得QDataStram能序列化一个自定义的类型,必须提供相应的<<>>操作符重载函数。代码例子如下:

struct ColorText
{
QString text;
QColor color;
};
QDataStream &operator<<( QDataStream &stream, const ColorText &data )
{
stream << data.text << data.color;
return stream;
}
QDataStream &operator>>( QDataStream &stream, ColorText &data )
{
stream >> data.text;
stream >> data.color;
return stream;
}

QList<ColorText> list;
ColorText data;
data.text = "Red";
data.color = Qt::red;
list << data;
...
QFile file( "test.dat" );
if( !file.open( QIODevice::WriteOnly ) )
return;
QDataStream stream( &file );
stream.setVersion( QDataStream::Qt_4_2 );
stream << list;
file.close();

QList<ColorText> list;
QFile file( "test.dat" );
if( !file.open( QIODevice::ReadOnly ) )
return;
QDataStream stream( &file );
stream.setVersion( QDataStream::Qt_4_2 );
stream >> list;
file.close();
foreach( ColorText data, list )
qDebug() << data.text << "("
<< data.color.red() << ","
<< data.color.green() << ","
<< data.color.blue() << ")";

访问目录

QDir类可用于浏览路径中的目录和文件。QDir提供了一些静态方法,可以很容易地浏览文件系统。如:

  • QDir::current()返回应用程序当前所在的工作目录。

  • QDir::home()返回用户的主目录。

  • QDir::root()返回根用户目录。

  • QDir::temp()返回临时文件目录。

  • QDir::drives()返回一个包含了QFileInfo对象的列表。

QFileInfo类提供了访问文件和目录信息的方法,如:

  • isDir(),isFile(), isSymLink():判断文件是否属于目录,一般文件或符号链接文件。

  • dir(),absoluteDir():返回相对目录或绝对目录。

  • exists();判断文件对象是否存在。

  • isHidden(),isReadable, isWritable()isExecutable():判断一个文件是否隐藏、可读、可写或可执行。

  • fileName():返回文件名。

  • filePath():返回文件名(包含路径)

  • absoluteFilePath():返回包含绝对路径的文件名。

  • completeBaseName(),completeSuffix():返回文件名和文件名后缀。

例如如下:

foreach( QFileInfo drive, QDir::drives() )
{
qDebug() << "Drive: " << drive.absolutePath();
QDir dir = drive.dir();
dir.setFilter( QDir::Dirs );
foreach( QFileInfo rootDirs, dir.entryInfoList() )
qDebug() << "" << rootDirs.fileName();
}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值