「Qtの基礎 - ファイル」の版間の差分
		
		
		
		
		
		ナビゲーションに移動
		検索に移動
		
				
		
		
	
|  (ページの作成:「== 概要 == ソフトウェアにおいて、ファイルの操作は非常に重要な項目である。<br> テキストファイルやバイナリファイル、画…」) | |||
| 91行目: | 91行目: | ||
| == ファイルの書き込み == | == ファイルの書き込み == | ||
| ==== テキストファイルの一括書き込み ==== | |||
| 以下の例では、テキストデータをファイルに出力している。<br> | |||
| 既にファイルが存在する場合は、エラーメッセージを表示して終了する。<br> | |||
|  <syntaxhighlight lang="c++"> | |||
|  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(); | |||
|  } | |||
|  </syntaxhighlight> | |||
| <br> | |||
| ==== バイナリデータの書き込み ==== | |||
| <br><br> | <br><br> | ||
| __FORCETOC__ | __FORCETOC__ | ||
| [[カテゴリ:Qt]] | [[カテゴリ:Qt]] | ||
2021年1月26日 (火) 00:03時点における版
概要
ソフトウェアにおいて、ファイルの操作は非常に重要な項目である。
テキストファイルやバイナリファイル、画像ファイル等、各フォーマットにしたがって、ファイルの入出力を行う必要がある。
ファイルフォーマットは、公開・非公開のものがあり、各フォーマットを理解してファイルの入出力を行うことは難しいが、
ライブラリを使用する場合、簡単に入出力を行うことができる。
ファイルの読み込み
テキストファイルの一括読み込み
以下の例では、一括で読み込んだテキストデータを改行コードで分割して、行数分だけ回して処理している。
ファイルのオープンに失敗した場合、エラーメッセージをデバッグ出力して終了する。
 #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();
 }
バイナリデータの書き込み