Qt 入出力デバイスとファイル操作

1. 入出力デバイス

QIODevice クラスは、Qt のすべての I/O デバイスの基本的なインターフェイス クラスであり、QFile、QBuffer、QTcpSocket などのデータ ブロックの読み取り/書き込みをサポートするデバイスに抽象インターフェイスを提供します。The QIODevice class is abstract and cannot be instantiated. 通常、QIODevice クラスによって定義されるインターフェイスは、デバイスに依存しない I/O 関数を提供するために使用されます。
QIODevice クラスの継承図
QIODevice は、ランダム アクセス デバイスとシーケンシャル ストレージ デバイスの 2 種類のデバイスを区別します。(isSequentiaU) 関数をプログラムで使用して、デバイスのタイプを判別できます。)

  • ランダム アクセス デバイスは、 seek() 関数を使用して任意の場所へのシークをサポートします。ファイル内の現在位置は、pos() 関数を使用して取得できます。このようなデバイスには、QFile、QBuffer などが含まれます。
  • シーケンシャル ストレージ デバイスは、任意の場所への配置をサポートしていないため、データは一度に読み取る必要があります。Pos() や size()などの関数は
    、シーケンシャル デバイスを操作するときに使用できません。このようなデバイスには、QTcpSocket、QUdpSocket、および QProcess が含まれます。

ファイルオープンモード

デバイスにアクセスする前に、open() 関数を使用してデバイスを開き、正しいオープン モードを指定する必要があります。QIODevice のすべてのオープン モードは、QIODevice::OPenMode 列挙型変数によって定義され、その値を次の表に示します。これらのいくつかは、ビットごとの OR 記号「丨」を使用して同時に使用できます。デバイスを開いた後、write() または putChar() を使用して書き込み、read()、readLine() または readAll() を使用して読み取り、最後に close() を使用してデバイスを閉じることができます。
ここに画像の説明を挿入
ここに画像の説明を挿入

次に、ファイル QFile

QFile クラスは、ファイルの読み取り/書き込み用のインターフェイスを提供します。これは、テキスト ファイル、バイナリ ファイル、および Qt リソースの読み取り/書き込みに使用できる I/O デバイスです。QFile は単独で使用することも、QTextStream や QDataStream と一緒に使用することもでき、より便利になります。
通常、ファイル名は QFile オブジェクトを構築するときに指定されますが、もちろん setFileName() を使用していつでも設定できます。exists() を使用してファイルが存在するかどうかを確認し、remove() を使用してファイルを削除できます。ファイル システムに関連するより高度な操作は、QFileInfo および QDir クラスで提供されます。
ファイルは、open() で開き、close() で閉じ、flush() でフラッシュできます。ファイルのデータの読み書きは一般的に QTextStream または QDataStream を使用して行われますが、read()、readLine()、readAll()、write() など、QIODevice クラスから継承された一部の関数を使用して、1 つのみを操作することもできます。一度に 1 文字 getChar()、putChar()、ungetChar() などの関数。size() 関数を使用してファイルのサイズを取得し、seek() を使用してファイル内の任意の位置を検索し、pos() を使用して現在の位置を取得し、atEnd() を使用してファイルの終わりかどうかを判別できます。ファイルに到達しました。
(1) QFile を直接使用してファイルを読み書きする
サンプルプログラムは次のとおりです。

//直接使用QFile写文件
QFile fileW("test.txt");
if (!fileW.open(QIODevice::WriteOnly | QIODevice::Text))
	return;
fileW.write("first line!\nsecond line");
fileW.close();

//直接使用QFile读文件
QFile fileR("test.txt");
if (!fileR.open(QIODevice::ReadOnly | QIODevice::Text))
	return;
while (!fileR.atEnd())
{
    
    
	QByteArray line = fileR.readLine();
	qDebug() <<line;
}
fileR.close();

(2) テキスト ストリームを使用してテキスト ファイルを読み書きする
QTextStream クラスは、QIODevice、QByteArray、および QString で操作できる、テキストを読み書きするための便利なインターフェイスを提供します。QTextStream のストリーム演算子を使用すると、単語、行、数字を簡単に読み書きできます。サンプルプログラムは次のとおりです。

//使用QTextStream文本流读文件
QFile fileW("test.txt");
if (!fileW.open(QIODevice::WriteOnly | QIODevice::Text))
	return -1;
QTextStream out(&fileW);
out << "first line" << "\nsecond line";
fileW.close();

//使用QTextStream文本流写文件
QFile fileR("test.txt");
if (!fileR.open(QIODevice::ReadOnly | QIODevice::Text))
	return -1;
QTextStream in(&fileR);
while (!in.atEnd())
{
    
    
	QString line = in.readLine();
	qDebug() <<line;
}

seek() を使用して指定された場所を見つけ、atEnd() を使用してまだ読み取ることができるデータがあるかどうかを判断できます。flush() 関数が呼び出されると、QTextStream は書き込みバッファ内のすべてのデータをクリアし、デバイスの flush() 関数を呼び出します。

内部的には、QTextStream は Unicode ベースのバッファを使用し、QTextStream は QTextCodec を使用してさまざまな文字セットを自動的にサポートします。デフォルトでは、QTextCodec::codecForLocale() によって返されるエンコーディングが読み取りと書き込みに使用され、setCodec() 関数を使用してエンコーディングを設定することもできます。
(3) データストリームによるバイナリデータの読み書き
QDataStream クラスは、QIODevice のバイナリデータのシリアル化を実現します。データ ストリームは、バイナリ エンコードされた情報のストリームであり、ホストのオペレーティング システム、CPU、およびバイト オーダーから完全に独立しています。データ ストリームは、エンコードされていない生のバイナリ データを読み書きすることもできます。QDataStream クラスは、char、Short、im、char* などの C++ 基本データ型のシリアル化を実現できます。より複雑なデータをシリアル化するには、データを基本的なデータ型に分解します。サンプルプログラムは次のとおりです。

//使用QTextStream文本流读文件
QFile fileW("test.txt");
if (!fileW.open(QIODevice::WriteOnly))
    return -1;
QDataStream out(&fileW);
//串行化字符串(写入时,要求强制转换为QString类型,否则写入的是乱码)
out << QString("the answer is");
//串行化整数
out << static_cast<qint32>(42);
fileW.close();

//使用QTextStream文本流写文件
QFile fileR("test.txt");
if (!fileR.open(QIODevice::ReadOnly))
    return -1;
QDataStream in(&fileR);
QString str;
qint32 num;
in >> str >> num;
qDebug() << str << num; //输出:"the answer is" 42
fileR.close();

データ ストリームに書き込まれる各エントリは、エントリの種類に応じて定義済みの形式を使用して書き込まれます。(そうしないと文字化けします) サポートされている Qt の型には、QBrush、QColor、QDateTime、QFom、QPixmap、QString、QVariant など多くの形式が含まれます。

3. ファイル情報 QFileInfo

QFileInfo クラスは、ファイルの名前、ファイル システム内の場所 (パス)、ファイルのアクセス許可、ディレクトリかシンボリック リンクかなど、システムに依存しないファイル情報を提供します。QFileInfo は、ファイルのサイズと最後の変更/読み取りの時間、および Qt リソースに関する情報も取得できます。QFileInfo が指すファイルは、QFileinfo オブジェクトの構築時、または後で setFile() を使用して設定できます。

  • QFileInfo は相対 (相対) パスまたは絶対 (絶対) パスを使用してファイルを指すことができ、makeAbsolute() を使用して相対パスを絶対パスに変換することもできます。
  • ファイルのタイプは、isFile()、isDir()、および isSymLink() を使用して取得できます。
    path() と fileName() を使用してファイルのパスとファイル名を取得できます。baseName() を使用してファイル名のベース名を取得し、suffix() を使用してファイル名のサフィックスを取得することもできます。 、completeSuffix() を使用して get 複合サフィックスを取得します。
  • ファイルの日付は、created()、lastModified()、および lastRead() を使用して返すことができます。
  • アクセス権は、isReadable()、isWritable()、および isExecutable() を使用して取得できます。
  • ファイルの所有権は、owner()、ownerId()、group()、および groupId() を使用して取得できます。

myFile という名前の新しい Qt5 コンソール アプリケーションを作成します。作成が完了したら、main.cpp ファイルの内容を次のように変更します。

#include <QtCore/QCoreApplication>
#include <QFileInfo>
#include <QTextCodec>
#include <QStringList>
#include <QDateTime>
#include <QDebug>

int main(int argc, char *argv[])
{
    
    
    QCoreApplication a(argc, argv);

    // 以只写方式打开,如果文件不存在,那么会创建该文件
    QFile file("myfile.txt");
    if (!file.open(QIODevice::WriteOnly  | QIODevice::Text))
        qDebug() << file.errorString();
    file.write("helloQt!\nyafeilinux");
    file.close();

    // 获取文件信息
    QFileInfo info(file);
    qDebug() << QObject::tr("绝对路径:") << info.absoluteFilePath() << endl
             << QObject::tr("文件名:") << info.fileName() << endl
             << QObject::tr("基本名称:") << info.baseName() << endl
             << QObject::tr("后缀:") << info.suffix() << endl
             << QObject::tr("创建时间:") << info.created() << endl
             << QObject::tr("大小:") << info.size();

    // 以只读方式打开
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        qDebug() << file.errorString();
    qDebug() << QObject::tr("文件内容:") << endl << file.readAll();
    qDebug() << QObject::tr("当前位置:") << file.pos();
    //移动文件开始读取位置为0
    file.seek(0);
    QByteArray array;
    array = file.read(5);
    qDebug() << QObject::tr("前5个字符:") << array
             << QObject::tr("当前位置:") << file.pos();
    //移动文件开始读取位置为15
    file.seek(15);
    array = file.read(5);
    qDebug() << QObject::tr("第16-20个字符:") << array;
    file.close();

    return a.exec();
}

プログラムを実行すると、コンソール出力は次のようになります。

"绝对路径:" "D:/Project/C++/Qt/myFile/build-myFile-Desktop_Qt_5_9_7_MinGW_32bit-Debug/myfile.txt"
"文件名:" "myfile.txt"
"基本名称:" "myfile"
"后缀:" "txt"
"创建时间:" QDateTime(2019-06-17 16:58:01.230 中国标准时间 Qt::TimeSpec(LocalTime))
"大小:" 20
"文件内容:"
"helloQt!\nyafeilinux"
"当前位置:" 20
"前5个字符:" "hello" "当前位置:" 5
"第16-20个字符:" "linux"

4番目に、一時ファイル QTemporaryFile

QTemporaryFile クラスは、一時ファイルを操作するための I/O デバイスであり、一意の一時ファイルを安全に作成できます。open() 関数が呼び出されると、一時ファイルが作成されます. 一時ファイルのファイル名は一意であることが保証されます. QTemporaryFile オブジェクトが破棄されると、ファイルは自動的に削除されます.
open() 関数を呼び出すと、デフォルトで QIODevice::ReadWrite モードが使用され、次のコードのように QTemporaryFile クラスを使用できます。

QTemporaryFile file;
if (file.open()) 
{
    
    
    // 在这里对临时文件进行操作,file.fileName()可以返回唯一的文件名
}

QTemporaryFile オブジェクトが破棄されない限り、close() 関数を呼び出した後に QTemporaryFile を再度開いても安全です。一時ファイルのみが常に存在し、QTemporaryFile によって内部的に開かれます。一時ファイルはデフォルトでシステムの一時ディレクトリに生成され、このディレクトリのパスは QDir::tempPath() を使用して取得できます。

おすすめ

転載: blog.csdn.net/houxian1103/article/details/129905227