Qtの基礎 - ファイル

提供:MochiuWiki : SUSE, EC, PCB
2021年1月26日 (火) 00:03時点におけるWiki (トーク | 投稿記録)による版 (→‎ファイルの書き込み)
ナビゲーションに移動 検索に移動

概要

ソフトウェアにおいて、ファイルの操作は非常に重要な項目である。
テキストファイルやバイナリファイル、画像ファイル等、各フォーマットにしたがって、ファイルの入出力を行う必要がある。

ファイルフォーマットは、公開・非公開のものがあり、各フォーマットを理解してファイルの入出力を行うことは難しいが、
ライブラリを使用する場合、簡単に入出力を行うことができる。


ファイルの読み込み

テキストファイルの一括読み込み

以下の例では、一括で読み込んだテキストデータを改行コードで分割して、行数分だけ回して処理している。
ファイルのオープンに失敗した場合、エラーメッセージをデバッグ出力して終了する。

 #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();
 }


バイナリデータの書き込み