MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの基礎 - ファイルのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの基礎 - ファイル
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == ソフトウェアにおいて、ファイルの操作は非常に重要な項目である。<br> テキストファイルやバイナリファイル、画像ファイル等、各フォーマットにしたがって、ファイルの入出力を行う必要がある。<br> <br> ファイルフォーマットは、公開・非公開のものがあり、各フォーマットを理解してファイルの入出力を行うことは難しいが、<br> ライブラリを使用する場合、簡単に入出力を行うことができる。<br> <br><br> == 実行ファイルがあるディレクトリ == 実行ファイルが存在するディレクトリを取得するには、以下のように記述する。<br> <syntaxhighlight lang="c++"> QString strAppDir = QCoreApplication::applicationDirPath(); </syntaxhighlight> <br><br> == ファイルの読み込み == ==== テキストファイルの一括読み込み ==== 以下の例では、一括で読み込んだテキストデータを改行コードで分割して、行数分だけ回して処理している。<br> ファイルのオープンに失敗した場合、エラーメッセージをデバッグ出力して終了する。<br> <syntaxhighlight lang="c++"> #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; } } </syntaxhighlight> <br> ==== テキストファイルの1行読み込み ==== 以下の例では、テキストストリームから1行ずつ読み込んで処理している。<br> ファイルを閉じた場合、テキストストリームが使用できなくなるため、最後にファイルを閉じる。<br> <syntaxhighlight lang="c++"> #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(); } </syntaxhighlight> <br> ==== 文字列の検索 ==== 特定の文字列を検索する場合は、テキストファイルを読み込みながら検索する文字列が各行に含まれているかを確認する。<br> <br> 以下の例では、各行が"hoge"という文字列と一致するかどうかを確認している。<br> 一致する行が存在する場合、その行を出力して処理を終了して、一致する行が存在しない場合はその旨を出力する。<br> <syntaxhighlight lang="c++"> void SearchString(const QString &filePath, const QString &str) { QFile File(filePath); if (!File.open(QIODevice::ReadOnly | QIODevice::Text)) { std::cerr << QString("ファイルのオープンに失敗 : %1").arg(File.errorString()).toStdString() << std::endl; return; } QTextStream in(&File); while (!in.atEnd()) { QString line = in.readLine(); if (line == str) { std::cout << QString("%1 が見つかりました").arg(str).toStdString() << std::endl; File.close(); return; } } std::cout << QString("%1 は見つかりませんでした").arg(str).toStdString() << std::endl; File.close(); } </syntaxhighlight> <br> ==== バイナリデータの読み込み ==== バイナリデータを読み込む場合は、<code>QFile</code>クラスの<code>readLine</code>メソッドまたは<code>readAll</code>メソッドを使用する。<br> <br> QDataStreamを使用してバイナリデータを書き出す場合、以下の問題が生じる。<br> QDataStreamの仕様において、バイナリデータを書き込む場合、先頭にバイナリデータのサイズが追加される。<br> これは、QDataStreamはバイナリデータを直列化するためのものだからである。<br> <syntaxhighlight lang="c++"> #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(); </syntaxhighlight> <br><br> == ファイルの書き込み == ==== テキストファイルの一括書き込み ==== 以下の例では、テキストデータをファイルに出力している。<br> 既にファイルが存在する場合は、エラーメッセージを表示して終了する。<br> <syntaxhighlight lang="c++"> void MainWindow::writeTextFile(QString FileName, QString strOutputData) { QString strErrMsg = ""; QFileInfo FileInfo(FileName); QFile File(FileName); if(!File.open(QIODevice::WriteOnly)) { QString strErrMsg = "File(" + FileInfo.fileName() + ") Open Error: " + File.errorString(); qDebug() << strErrMsg; return; } QTextStream OutStream(&File); OutStream << strOutputData; File.close(); } </syntaxhighlight> <br> 以下の例では、QTextStreamクラスを使用して書式を設定している。<br> <syntaxhighlight lang="c++"> // 浮動小数 QFile file(strFName); QTextStream OutStream(&file); // 浮動小数 e+形式 OutStream.setRealNumberNotation(QTextStream::ScientificNotation); // 浮動小数の桁数を固定 OutStream.setRealNumberNotation(QTextStream::FixedNotation); // 浮動小数点の桁数を設定 OutStream.setRealNumberPrecision(3); </syntaxhighlight> <br> 列ごとに列幅を設定する場合は、1つ列を出力するごとに設定する必要がある。<br> <syntaxhighlight lang="c++"> QFile file(strFName); QTextStream OutStream(&file); // 列を右寄せに設定 OutStream.setFieldAlignment(QTextStream::AlignRight); // 1列目の文字数を設定 OutStream.setFieldWidth(20); OutStream << "1列目" // 2列目の文字数を設定 // 最終列の改行では、std::endlを使用してはならない OutStream.setFieldWidth(40); OutStream << "2列目" + "\n" << flush; </syntaxhighlight> <br> <u>※注意</u><br> <u>最終列の改行において、std::endlを使用する場合、それが1つの列として扱われるため、</u><br> <u>空列が1つ余計に追加されて余分な空白が末尾に追加されてしまう。</u><br> <br> 以下の例では、出力エンコーディングを指定する。<br> <syntaxhighlight lang="c++"> // 例. UTF-8にする場合 QFile file(strFName); QTextStream OutStream(&file); OutStream.setCodec("UTF-8"); </syntaxhighlight> <br> 出力エンコードをShift-JISに設定する場合、"~"が文字化けする時がある。<br> 詳細を知りたい場合は、こちらのWebサイトを参照すること。<br> http://park3.wakwak.com/~ozashin/sw_tips/webapp_tips/sjis_charset.html<br> <br> この文字化けを直すには、以下のように記述する。(Winodwsのみ)<br> <syntaxhighlight lang="c++"> QFile file(strFName); QTextStream OutStream(&file); OutStream << str.replace(QChar(0x301C), QChar(0xFF5E)); </syntaxhighlight> <br> 以下の例では、ファイルの先頭にテキストを追記している。<br> # まず、既存のファイルの内容を読み込み、その内容をメモリ(<code>QString</code>クラスや<code>QByteArray</code>)に保存する。 # 次に、追加する内容と元のファイル内容を結合させる。 # 最後に、新しい内容でファイルを上書きする。 <syntaxhighlight lang="c++"> #include <QFile> #include <QTextStream> QFile File("/tmp/sample.txt"); if (!File.open(QIODevice::ReadOnly | QIODevice::Text)) { std::cerr << QString("Failed to open file for reading.").toStdString() << std::endl; return -1; } // 元のファイル内容を読み込む QString oldText; QTextStream in(&File); oldText = in.readAll(); File.close(); // 追加する内容と元のファイル内容を結合させる QString newText = "hoge" + "\n" + oldText; // ファイルに新しい内容を書き込む if (!File.open(QIODevice::WriteOnly | QIODevice::Text)) { std::cerr << QString("Failed to open file for writing.").toStdString() << std::endl; return -1; } QTextStream out(&File); out << newText; File.close(); </syntaxhighlight> <br> ==== バイナリデータの書き込み ==== バイナリデータを書き込む場合は、<code>QFile</code>クラスの<code>write</code>メソッドを使用する。<br> <br> QDataStreamを使用してバイナリデータを書き出す場合、以下の問題が生じる。<br> QDataStreamの仕様において、バイナリデータを書き込む場合、先頭にバイナリデータのサイズが追加される。<br> これは、QDataStreamはバイナリデータを直列化するためのものだからである。<br> <syntaxhighlight lang="c++"> #include <QFile> QFile File(FileName); if(!File.open(QIODevice::WriteOnly)) { QString strErrMsg = "File(" + QFileInfo(File).fileName() + ") Open Error: " + File.errorString(); qDebug() << strErrMsg; return; } QByteArray ByAryData = QString("48656c6c6f").toUtf8().toHex(); File.write(ByAryData); File.close(); </syntaxhighlight> <br> また、<code>QByteArray</code>クラスは、以下のように宣言することができる。<br> <syntaxhighlight lang="c++"> // 宣言 1 QByteArray data_1 = {0x0c, 0x06, 0x04, 0x04, 0x02, 0x00}; // 宣言 2 QByteArray data_2 = QByteArray("\x0c\x06\x04\x04\x02\x00", 6); // 宣言 3 QByteArray data_3; data_3.append((char)0x0c); data_3.append((char)0x06); data_3.append((char)0x04); data_3.append((char)0x04); data_3.append((char)0x02); data_3.append((char)0x00); data_3.append((char)0xFF); std::cout << data_3.size() << std::endl; std::cout << data_3.toHex().toStdString().c_str() << std::endl; // 宣言 4 char v1 = 0x01, v2 = 0x02; QByteArray data_4(std::begin<char>({0x00, v1, v2, v2, 0x05, 0x06, '\xf3'}), 7); </syntaxhighlight> <br><br> == CSVファイル == 以下の例では、CSVファイルを作成している。<br> 処理手順は以下の通りである。<br> # 数値データを生成する。<br>ここでは、sin曲線y=sin(x)を生成する。 # 数値データをテキストデータに変換する。 # ファイル保存ダイアログを開いて、保存するファイル名を入力する。 # 全テキストデータを書き込む。 <br> <syntaxhighlight lang="c++"> #include <QFileDialog> #include <QMessageBox> #include <QTextStream> #include <QFile> #include <vector> #include <math.h> #include <sstream> #include "mainwindow.h" #include "ui_mainwindow.h" using namespace std; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::OnButtonClicked() { // Input File Name QString FileName = QFileDialog::getSaveFileName(this, tr("Save CSV File"), "", tr("CSV (*.csv);;All Files (*)")); if(FileName.isEmpty()) { // Cancel return; } // Generate CSV Data int iSize = 100; vector<double> lx(iSize, 0.0f), ly(iSize, 0.0f); double dx = 2 * 3.15159 / iSize; for(int i = 0; i < iSize; i++) { lx[i] = i * dx; ly[i] = sin(vx); } // Convert from Double to String QString strFileData = ""; //stringstream ss; for(int i = 0; i < iSize; i++) { strFileData += lx[i] + ", " + ly[i] + "\n"; //ss << lx[i] << "," << ly[i] << endl; } // Write to File QFile File(FileName); if(!File.open(QIODevice::WriteOnly)) { QMessageBox::information(this, tr("Unable to open file"), File.errorString()); return; } QTextStream OutStream(&File); // 浮動小数点をe形式にする //OutStream.setRealNumberNotation(QTextStream::ScientificNotation); // 浮動小数点の桁数を固定 //OutStream.setRealNumberNotation(QTextStream::FixedNotation); // 浮動小数点の桁数を設定 OutStream.setRealNumberPrecision(3); OutStream << strFileData; //OutStream << ss.str().c_str(); File.close(); } </syntaxhighlight> <br><br> == INIファイル == ==== INIファイルの書き込み ==== 以下の例では、ソフトウェアにおけるウインドウの状態を保存している。<br> <br> ウインドウの座標、縦横のサイズ、状態、最少幅、タイトル文字列をSetting.iniファイルに保存する。<br> もし、Settings.iniファイルが存在する場合は上書きする。<br> <syntaxhighlight lang="c++"> void MainWindow::saveSetting() { QSettings settings("settings.ini", QSettings::IniFormat, this); settings.beginGroup("MainWindow"); settings.setValue("pos", pos()); if(!isMaximized()) { settings.setValue("size", size()); } settings.setValue("maximized", isMaximized()); settings.setValue("miniwid", minimumWidth()); settings.setValue("title", windowTitle()); settings.endGroup(); } </syntaxhighlight> <br> 以下の例では、ソフトウェア終了時に、ウインドウの幅と高さをINIファイルに保存している。<br> <syntaxhighlight lang="c++"> // mainwindow.cpp #include <QMessageBox> #include <QSettings> #include <QSize> #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ORG_NAME = "My Company"; APP_NAME = "My Tool"; QSettings settings(ORG_NAME, APP_NAME); int width = settings.value("Window / Width").toInt(); int height = settings.value("Window / Height").toInt(); this->resize(QSize(width, height)); } MainWindow::~MainWindow() { delete ui; } // ソフトウェアの終了処理はcloseEventをオーバーライドすることで実現できる void MainWindow::closeEvent(QCloseEvent *event) { int width = this->geometry().width(); int height = this->geometry().height(); QMessageBox::information(this, "Finish Timing", tr("window width : %1 \nwindow height : %2").arg(width).arg(height)); QSettings settings(ORG_NAME, APP_NAME); settings.setValue("Window / Width", width); settings.setValue("Window / Height", height); } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui {class MainWindow;} class MainWindow : public QMainWindow { Q_OBJECT private: const QString ORG_NAME; const QString APP_NAME; public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; protected: virtual void closeEvent(QCloseEvent *event); }; #endif // MAINWINDOW_H </syntaxhighlight> <br> ==== INIファイルの読み込み ==== 以下の例では、前回のウインドウの状態を復元している。<br> Setting.iniファイルから必要な情報を読み込み、画面の状態を変更する。<br> <br> Settings.iniファイルが存在しない場合またはpos等のキー値が無ければ何もしない。<br> <syntaxhighlight lang="c++"> bool MainWindow::loadSetting() { QSettings settings("settings.ini", QSettings::IniFormat, this); settings.beginGroup("MainWindow"); if(settings.contains("pos")) { move(settings.value("pos", QPoint(50, 40)).toPoint()); } if(settings.contains("size")) { resize(settings.value("size", QSize(800, 720)).toSize()); } if(settings.value("maximized").toBool()) { setWindowState(windowState() | Qt::WindowMaximized); } if(settings.contains("miniwid")) { setMinimumWidth(settings.value("miniwid", 400).toInt()); } if(settings.contains("title")) { setWindowTitle(settings.value("title", "なし").toString()); } settings.endGroup(); } </syntaxhighlight> <br> 以下に、設定ファイル(Settings.ini)の内容を示す。<br> 左上位置(46, 15)、画面サイズ(800x600)、最大化(false)、最少幅(400)、画面のタイトルが"サンプル画面"の場合である。<br> [MainWindow] pos=@Point(46 15) size=@Size(800 600) maximized=false miniwid=400 title=\x30b5\x30f3\x30d7\x30eb\x753b\x9762 <br><br> == ファイル情報 == ==== ファイルの存在確認 ==== ファイルが存在すれば<code>true</code>、存在しなければ<code>false</code>を返す。<br> <syntaxhighlight lang="c++"> #include <QFileInfo> bool MainWindow::FileExists(const QString &FileName) { QFileInfo FileInfo(FileName); return FileInfo.exists(); } </syntaxhighlight> <br> また、<code>QFile</code>クラスを使用する場合は、以下のように記述する。<br> <syntaxhighlight lang="c++"> if(QFile::exists("<ファイルのパス>")) { // ファイルが存在する場合 } else { // ファイルが存在しない場合 } </syntaxhighlight> <br> ==== ファイルタイプの取得 ==== ファイルタイプの確認において、ファイルは1、ディレクトリは2、その他は0を返す。<br> <syntaxhighlight lang="c++"> int MainWindow::FileType(QString FileName) { QFileInfo fileInfo(FileName); if(FileInfo.isFile()) { reuturn 1; } else if(FileInfo.isDir()) { reuturn 2; } return 0; } </syntaxhighlight> <br> ==== ファイル情報の取得 ==== 以下に、ファイル情報の取得例を示す。<br> <syntaxhighlight lang="c++"> QFileInfo f1("/home/<ユーザ名>/memo.txt"); QFileInfo f2("/home/<ユーザ名>/tmp/arc.tar.gz"); QFileInfo f3("/home/<ユーザ名>/memo.txt_シンボリックリンク"); </syntaxhighlight> <br> Windowsのリンクファイルも、リンク先のファイルサイズを返す。<br> <center> {| class="wikitable" |+ ファイル情報の取得例 |- ! 取得する情報 !! 使用例 !! 出力 |- | ファイルのフルパス || f1.absoluteFilePath()<br>f2.absoluteFilePath() || "/home/<ユーザ名>/memo.txt"<br>"/home/<ユーザ名>/tmp/arc.tar.gz" |- | ファイルが存在するディレクトリのフルパス || f1.absolutePath()<br>f2.absolutePath() || "/home/<ユーザ名>"<br>"/home/<ユーザ名>/tmp" |- | ファイル名のみ || f1.fileName()<br>f2.fileName() || "memo.txt"<br>"arc.tar.gz" |- | ベース名 || f1.baseName()<br>f2.baseName() || "memo"<br>"arc" |- | 完全なベース名 || f1.completeBaseName()<br>f2.completeBaseName() || "memo"<br>"arc.tar" |- | 拡張子 || f1.suffix()<br>f2.suffix() || "txt"<br>"gz" |- | 完全な拡張子 || f1.completeSuffix()<br>f2.completeSuffix() || "txt"<br>"tar.gz" |- | リンクの絶対パス || f3.symLinkTarget() || "/home/<ユーザ名>/memo.txt" |- | 作成日 || f1.created() || QDateTime |- | 更新日 || f1.lastModified() || QDateTime |- | アクセス日 || f1.lastRead() || QDateTime |- | サイズ || f1.size()<br>f3.size() || 5590<br>5590 |} </center> <br> ==== ファイル情報の確認 ==== 以下に、ファイル情報の確認方法を示す。<br> <syntaxhighlight lang="c++"> QFileInfo FileInfo("チェックするパス"); </syntaxhighlight> <br> <center> {| class="wikitable" |+ ファイル情報の確認例 |- ! 用途 !! 使用例 !! 出力 |- | 絶対パスか || FileInfo.isAbsolute() || true: 絶対パス<br>false: 他 |- | 相対パス || FileInfo.isRelative() || true: 相対パス<br>false: 他 |- | ルートディレクトリに存在するか || FileInfo.isRoot() || true: ある<br>false: ない |- | ファイルか || FileInfo.isFile() || true: ファイル<br>false: 他 |- | ディレクトリか || FileInfo.isDir() || true: ディレクトリ<br>false: 他 |- | 隠しファイルか || FileInfo.isHidden() || true: 隠しファイル<br>false: 他 |- | リンクファイルか || FileInfo.isSymLink() || true: リンクファイル<br>false: 他 |- | 読み込み可能か || FileInfo.isReadable() || true: 可能<br>false: 不可 |- | 書き込み可能か || FileInfo.isWritable() || true: 可能<br>false: 不可 |- | 実行可能か || FileInfo.isExecutable() || true: 可能<br>false: 不可 |} </center> <br><br> == ファイルの検索 == ==== QDirを使用する ==== <syntaxhighlight lang="c++"> QString path = QApplication::applicationDirPath() + "/images/"; QStringList nameFilters; nameFilters.append("*.png"); nameFilters.append("*.jpg"); QDir dir(path); QStringList entry = dir.entryList(nameFilters, QDir::Files); for(QString file : entry) { // 検索して見つかったファイル群 qDebug() << dir.filePath(file); } </syntaxhighlight> <br> ==== QDirIteratorを使用する ==== <syntaxhighlight lang="c++"> QString path = QApplication::applicationDirPath() + "/images/"; QStringList nameFilters; nameFilters.append("*.png"); nameFilters.append("*.jpg"); QDirIterator itDirs(path, nameFilters, QDir::Files); while(itDirs.hasNext()) { QString file = itDirs.next(); qDebug() << file; } </syntaxhighlight> <br><br> == ファイルの再帰検索 == 再帰呼び出しを使用して、サブディレクトリのファイル名まで取得する。<br> 各ディレクトリごとに再帰処理を行い、ファイルのパスをリストに追加している。<br> <syntaxhighlight lang="c++"> QStringList MainWindow::SearchFiles(const QString &Path) { QDir dir(Path); QStringList list; foreach(QString File, dir.entryList(QDir::Files)) { // ディレクトリ直下に存在するファイルの探索(深さ1のファイル探索) list.append(Path + QDir::separator() + File); } foreach(QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { // サブディレクトリに存在するファイルの探索 list = list << SearchFiles(Path + QDir::separator() + subDir); } return list; } </syntaxhighlight> <br> <u>再帰呼び出しを使用せずに、サブディレクトリまで検索することもできる。</u><br> <syntaxhighlight lang="c++"> QString path = QApplication::applicationDirPath() + "/images/"; QStringList nameFilters; nameFilters.append("*.png"); nameFilters.append("*.jpg"); QDirIterator itDirs(path, nameFilters, QDir::Files, QDirIterator::Subdirectories); while(itDirs.hasNext()) { QString file = itDirs.next(); qDebug() << file; } </syntaxhighlight> <br><br> == 一時ファイル == 一時ファイルを作成するには、<code>QTemporaryFile</code>クラスを使用する。<br> <br> <code>QFile</code>クラスと異なる点は、以下の通りである。<br> * 常に読み書きモードで開く。 * ファイルパスが衝突しない。 * デストラクタが呼び出されたら自動的に削除される。 <br> 特に、ファイル名には重複した名前が付かない仕組みになっている。(ファイルパスが衝突しないことは重要である)<br> ファイル名を重複しないように、"<ソフトウェア名>.<xxx>"のような名前を付けて、システムディレクトリに保存される。<br> <br> 以下の例では、既存のファイルをシステムディレクトリの一時ファイルとしてコピーしている。<br> <br> 一時ファイルのパスは、<code>fileTemplate</code>メソッドから取得できる。<br> (<code>setFileTemplate</code>メソッドを使用して、一時ファイルのパスを変更することもできる)<br> 他は、<code>QFile</code>クラスの使用方法と同様である。<br> <syntaxhighlight lang="c++"> QTemporaryFile TmpFile; QFile::copy("<既存ファイルのパス>", TmpFile.fileTemplate()); TmpFile.open(); // ...略 </syntaxhighlight> <br><br> == メモリマップファイル == メモリマップファイルとは、メモリ空間の一部のように直接読み書きできるファイルのことである。<br> <br> メモリマップファイルのメリットを以下に示す。<br> * 高速にアクセスすることが可能である。 * メモリ内容を書き換えることにより、ファイルの内容を更新できる。 * 大きなサイズのファイルを扱う場合、使用するメモリ量が少ない。 <br> メモリマッピングには、<code>QFileDevice</code>クラスの<code>map</code>メソッドを使用する。<br> # <code>QFile</code>クラスを使用して、ファイルを作成または開く。 # <code>map</code>メソッドを使用して、ファイルの内容をメモリにマッピングする。<br>マッピングに成功した場合、ファイルのメモリ空間を<code>unsigned char</code>型の配列として返す。<br>それを介して、ファイルを読み書きすることが可能となる。 # マッピングした内容を読み書きする。 # メモリをアンマッピングする。 <br> <code>QFile</code>クラスのデストラクタが呼ばれた場合、または、同じインスタンスで新しいファイルを開いた場合は、自動的にアンマッピングされる。<br> <br> 以下の例では、既存のファイルを開いて10文字目の文字を書き換えている。<br> <syntaxhighlight lang="c++"> // ファイルを開く QFile file("Sample.txt"); file.open(QFile::ReadWrite); // ファイルの内容をメモリにマッピング unsigned char *pMem = file.map(0, file.size()); // 10文字目を書き換える pMem[10] = 'A'; // メモリをアンマッピング file.unmap(memory); // ファイルを閉じる file.close(); </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtの基礎 - ファイル
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse