Qtの基礎 - ファイル
ナビゲーションに移動
検索に移動
概要
ソフトウェアにおいて、ファイルの操作は非常に重要な項目である。
テキストファイルやバイナリファイル、画像ファイル等、各フォーマットにしたがって、ファイルの入出力を行う必要がある。
ファイルフォーマットは、公開・非公開のものがあり、各フォーマットを理解してファイルの入出力を行うことは難しいが、
ライブラリを使用する場合、簡単に入出力を行うことができる。
ファイルの読み込み
テキストファイルの一括読み込み
以下の例では、一括で読み込んだテキストデータを改行コードで分割して、行数分だけ回して処理している。
ファイルのオープンに失敗した場合、エラーメッセージをデバッグ出力して終了する。
#include <QTextStream>
#include <QFile>
void MainWindow::readTextFileAll(const QString &FileName)
{
QFile File(FileName);
if(!File.open(QIODevice::ReadOnly))
{
QString strErrMsg = "File(" + QFileInfo(File).fileName() + ") Open Error: " + File.errorString();
qDebug << strErrMsg;
return;
}
QTextStream InStream(&File);
QString strTextData = InStream.readAll();
File.close();
QList<QString> Lines = istrTextData.split("\n");
foreach (QString Line, Lines)
{
qDebug() << line;
break;
}
}
テキストファイルの1行読み込み
以下の例では、テキストストリームから1行ずつ読み込んで処理している。
ファイルを閉じた場合、テキストストリームが使用できなくなるため、最後にファイルを閉じる。
#include <QTextStream>
#include <QFile>
void MainWindow::readTextFileLine(const QString &FileName)
{
QFile File(FileName);
if(!File.open(QIODevice::ReadOnly))
{
QString strErrMsg = "File(" + QFileInfo(File).fileName() + ") Open Error: " + File.errorString();
qDebug() << strErrMsg;
return;
}
QTextStream InStream(&File);
while(!InStream.atEnd())
{
qDebug() << InStream.readLine();
break;
}
File.close();
}
バイナリデータの読み込み
バイナリデータを読み込む場合は、QFile
クラスのreadLine
メソッドまたはreadAll
メソッドを使用する。
QDataStreamを使用してバイナリデータを書き出す場合、以下の問題が生じる。
QDataStreamの仕様において、バイナリデータを書き込む場合、先頭にバイナリデータのサイズが追加される。
これは、QDataStreamはバイナリデータを直列化するためのものだからである。
#include <QFile>
QFile File(FileName);
if(!File.open(QIODevice::ReadOnly))
{
QString strErrMsg = "File(" + QFileInfo(File).fileName() + ") Open Error: " + File.errorString();
qDebug() << strErrMsg;
return;
}
QByteArray ByAryData = File.readAll();
File.close();
ファイルの書き込み
テキストファイルの一括書き込み
以下の例では、テキストデータをファイルに出力している。
既にファイルが存在する場合は、エラーメッセージを表示して終了する。
void MainWindow::writeTextFile(QString FileName, QString strOutputData)
{
QString strErrMsg = "";
QFileInfo FileInfo(FileName);
if(FileInfo.exists())
{
strErrMsg = "既存ファイル(" + FileInfo.suffix() + ")には出力できません"
QMessageBox::information(this, tr("ファイル出力エラー"), strErrMsg);
return;
}
QFile File(FileName);
if (!File.open(QIODevice::WriteOnly))
{
strErrMSg = "ファイル(" + FileInfo.suffix() + ")オープンエラー:" + File.errorString();
qDebug() << strErrMsg;
return;
}
QTextStream OutStream(&File);
OutStream << strOutputData;
File.close();
}
バイナリデータの書き込み