QFile官方帮助文档-详细介绍部分(个人翻译)

QFile是用于读写文本、二进制文件和资源的I/O设备。QFile可以自己单独用,和QTextStream或QDataStream一起用,更方
便。
文件名通常通过构造函数传入,可用setFileName()随时候重新设置。无论什么操作系统,QFile要求文件分隔符是'/',不支持其他分隔符(例:'\')。
用open()打开文件,用close()关闭文件,用flush()清空缓存数据至I/O。通常用QDataStream和QTextStream读写数据,也可用继承自QIODevice的函数read()、readLine()、readAll()、write()。若每次只想处理单个字符,用继承下来的getChar()、putChar()和ungetChar()。

size()返回值为文件大小。pos()返回值为当前文件位置,seek()移动文件位置至新位置。atEnd()查看是否已到文件底部,若是,返回true。

直接读取文件:
以下示例展示如何一行一行地读取文本
QFile file("in.txt");
 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

    while (!file.atEnd()) {
        QByteArray line = file.readLine();
        process_line(line);
  }

标识QIODevice::Text通知Qt,转换Window风格行终止符("\r\n")为C++风格行终止符("\n")。默认情况,QFile不对文件内容做任何转换,当二进制文件处理。


使用流Streams读取文件
这个例子是用QTextStream一行行地读取文本
 QFile file("in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

      QTextStream in(&file);
      while (!in.atEnd()) {
          QString line = in.readLine();
          process_line(line);
      }

QTextStream会将硬盘中存储的8-bit数据转换为16-bit的Unicode编码。默认下,QFile认为用户系统是使用本地8-bit编码(例如:大多数基于unix的操作系统使用UTF-8;详细信息可通过QTextCode::codecForLocale查询)。该操作通过QTextStream::setCodec()可修改。

用重载的运算符operator<<()写文本,QTextStream位于运算符左面,各种数据(包括QString)位于运算符右边。

 QFile file("out.txt");
      if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
          return;

      QTextStream out(&file);
      out << "The magic number is: " << 49 << "\n";


QTextStream,用operator<<()写数据,用operator>>()读数据。详见类文档。
Qt下,QFile、QFileInfo、QDir支持Unicode编码文件名访问系统文件系统。Unix上,Unicode编码文件名被转化为8-bit编码。若想用标准C++ API(<cstdio>或<iostream)或平台特定的API去访问文件,可用encodeName()和decodeName()在Unicode编码文件名8-bit编码文件名间互转。

Unix上,有一些特殊的系统文件(例如:in/proc),调用size(),返回值为0,但read()却依然能返回更多的数据。这种情况下,atEnd()无法判断是否还有未读的数据(因为atEnd()返回true的依据是文件size()为0)。取而代之的办法是,不停重复地调用readAll()、read()或readLine()直到没有数据可读出。以下例子展示用QTextStream一行行地读取/proc/modules:

  QFile file("/proc/modules");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

      QTextStream in(&file);
      QString line = in.readLine();
      while (!line.isNull()) {
          process_line(line);
          line = in.readLine();
      }

信号:
与其他QIODevive的实现不同(比如QTcpSocket),QFile不发出aboutToClose()、bytesWriten()或readRead()信号。因此,QFile不适合读写该类文件,比如Unix平台的设备文件。

平台特定问题:
Unix-like和windows下文件权限不同。Unix-like系统,文件夹禁写,文件就不能创建。windows下,就没有这种问题。例如,"My Document"文件夹通常禁写,但可在其内创建文件。
Qt了解文件权限限制,用QFile::setPermission()函数来调整
。windows下,若没有任何写标识传入,Qt仅设置系统默认的只读标识。Qt不操作控制列表(ACLS),调整他,会使QFile::setPermission()对NTFS volumes失效。使用VFAT文件系统的USB sticks,他可能会有效。Qt也不操作POSIX ACLS。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值