環境
Raspberry Pi 3B+
$ uname -a // Linux 5.10.103-v7+
$ cat /etc/os-release // Raspbian GNU/Linux 10 (buster)
$ cat /etc/debian_version // 10.13
Qt Creator 4.8.2
Qt 5.11.3 (GCC 8.3.0, 32bit)
QFileクラス
テキストファイル、バイナリーファイル、リソースの読み取り・書き込み用クラス。
QFileのみで読み取り・書き取り動作を実装できる。
QTextStream, QDataStreamを併せることでより便利な活用ができる。
ファイルシステム関連の高度な操作が必要な場合は、QFileInfo, QDirを利用する。
継承親子関係:QObject > QIODevice > QFileDevice > QFile
QFile Class | Qt Core 5.15.15
基本的な機能
ファイルの指定
QFile file("/dir/test.txt");
QFile file;
file.setFileName("/dir/test.txt");
QFile file;
QDir::setCurrent("/dir");
file.setFileName("test.txt");
ファイルパス内の区切り文字は、OSに関わらず”/”を使用する。バックスラッシュ等は使用不可。
file.fileName(); // 設定されているファイル名を返す(QString型)
ファイルの存在確認
QFile file("test.txt");
file.exists(); // ファイルが存在する場合true, 存在しない場合false を返す
ファイルを開く
file.open(); // 成功した場合はtrue、失敗した場合はfalseを返す
QIODeviceクラスのオープンモードフラグを利用しファイルを開くモードを指定する必要がある。
オープンモードフラグは、ReadOnly, WriteOnly, ReadWriteのいずれかを必ず設定する。
オプションでその他のフラグを追加することができる。
必要な読み出し・書き込みが完了したら必ずclose()でファイルを閉じる。
openMode
- ReadOnly 読み取り可能
- WriteOnly 書き込み可能/ファイルが存在しない場合、作成してから開く
ReadWrite, Append, NewOnlyのいずれかと組み合わせなければTruncate扱い(全上書き)となる
- ReadWrite 読み書き可能/ファイルが存在しない場合、作成してから開く
- Append ファイルの末尾に書き込み
- Truncate 上書き(元ファイルを破棄して実行みたいな感じ)
- Text 行末の改行コードに関係がある?っぽい
Write時は利用端末に合わせた改行、Read時は\nとなる
テキストファイルならつけておいたほうがよさそう
- NewOnly ファイルが存在する場合は失敗/ファイルが存在しない場合は作成してから開く
- ExistingOnly ファイルが存在する場合は開く/ファイルが存在しない場合は失敗するため、自動でファイルを作成しない/WriteOnly, ReadWriteと組み合わせて使用する
QIODevice Class | Qt Core 5.15.15
ファイルを閉じる
file.close();
ファイルクローズの明確な効果・必要性は、まだ調べ切れていない。
(クローズシグナル発信、デバイスクローズ、オープンモード設定解除、エラー文字列のリセットなどをしているようです。もう少し深堀して理解したいところ…)
ファイルを閉じないということは「読み取り・書き込みができる状態のまま」ということ。場合によってはバグや悪意のある攻撃の対象になるかもしれない。
とりあえず、open→処理→closeというセットで使用するのが吉。
使用例
編集中