C++でファイル操作する方法です。
fstreamライブラリを使用した操作方法
<fstream>
ライブラリを使用してファイル操作を行う方法です。
ファイルの読み込み
ファイルを読み込みするには、std::ifstream
を使用します。
ファイルからデータにInputするから、ifstream
と覚えるといいでしょう。
#include <fstream>
#include <string>
int main() {
std::ifstream file("file_name.txt");
std::string line;
while (std::getline(file, line)) {
// 処理を行う
}
file.close();
}
ファイルを開いた後、std::getline
で改行コードまでの1行を読み込みます。
ファイルの終端でstd::getline
はfalse
を返すのでwhile
ループを抜けてファイルがクローズされます。
std::ifsream
のもう少し詳細な説明は以下を参照してください。
ファイルの書き込み
ファイルを書き込みするには、std::ofstream
を使用します。
ファイルにOutputするから、ofstream
と覚えるといいでしょう。
#include <fstream>
int main() {
std::ofstream file("file_name.txt");
file << "Hello World!!" << std::endl;
file.close();
}
ファイルを開いて、データを書き込んで、ファイルをクローズしています。
この場合、既に同名のファイルが存在する場合、元のファイルの内容は破棄されて新しいデータで上書きされます。
既存のファイルに追記する場合は、std::ios::app
フラグを使います。
#include <fstream>
int main() {
std::ofstream file("file_name.txt", std::ios::app);
file << "Append Message!!" << std::endl;
file.close();
}
std::ofstream
のもう少し詳細な説明は以下を参照してください。
C言語スタイルのファイル操作方法
C++はC言語との互換性があるので、cstdio
ライブラリを使用してC言語スタイルのファイル操作を行う方法です。
fopen()
関数でファイルを開き、読み込み関数 or 書き込み関数でファイル操作を行い、fclose()
関数でファイルを閉じます。
ファイルを開く
fopen()
関数を使用してファイルを開きます。
#include <cstdio>
#include <iostream>
int main() {
FILE* fp = fopen("file_name.txt", "r"); // 読み込みモードで開く
if (fp == nullptr) {
std::cout << "ファイルを開けませんでした" << std::endl;
return -1;
}
fclose(fp);
}
fopen
関数の第二引数はオープンモードとなっています。
ファイル操作 | モード | ファイル有り | ファイル無し |
---|---|---|---|
読み込み | r | 開ける | 開けない |
書き込み | w | 開ける(元ファイル内容は破棄) | 開ける(新規作成される) |
追記 | a | 開ける(元ファイルの最後に追記) | 開ける(新規作成される) |
読込+書込 | r+ | 開ける | 開けない |
読込+書込 | w+ | 開ける(元ファイル内容は破棄) | 開ける(新規作成される) |
読込+追記 | a+ | 開ける(元ファイルの最後に追記) | 開ける(新規作成される) |
バイナリモードで開く場合は、"rb"
や"ab"
、"w+b"
のように"b"
を付加します。
ファイルを読み込む
ファイルを読み込むための関数は複数あり、用途によって使い分けます。
#include <cstdio>
#include <iostream>
int main() {
// file_name.txtを読み込みモードで開く
FILE* fp = fopen("file_name.txt", "r");
if (fp == nullptr) {
std::cout << "ファイルを開けませんでした" << std::endl;
}
char buffer[100];
fgets(buffer, sizeof(buffer), fp); // 任意のサイズもしくは改行コードまで読み込む
std::cout << buffer << std::endl;
int i = fgetc(fp); // 1文字読み込む
std::cout << std::to_string(i) << std::endl;
i = fread(buffer, sizeof(char), sizeof(buffer), fp); // 任意のサイズ読み込む
std::cout << buffer << std::endl;
fclose(fp);
}
fgets()
関数はファイルから1行読み込むのに適しています。読み込む最大文字数を指定して関数を呼び出すと最大文字数に達するか改行コードが出現するまで読み込みます。
fgetc()
関数はファイルから1文字読み込みます。正直あまり使い道が浮かびません。
fread()
関数はバイナリデータを読み込むのに適しています。改行コードやNULL文字などを気にせず指定したサイズ分読み込むことができます。
ファイルを書き込む
ファイルを書き込むための関数は複数あり、用途によって使い分けます。
#include <cstdio>
#include <iostream>
int main() {
FILE* fp = fopen("file_name2.txt", "w");
if (fp == nullptr) {
std::cout << "ファイルを開けませんでした" << std::endl;
}
char buffer[] = "てすとてすとてすと\n";
fputs(buffer, fp); // 書き込み
char writebuff[] = "1234567890\n";
fwrite(writebuff, sizeof(char), sizeof(writebuff)-1, fp); // 指定サイズ書き込み
int i = 50;
fputc(i, fp); // 1文字書き込み
fclose(fp);
}
【file_name2.txtの内容】
てすとてすとてすと
1234567890
2
fputs()
関数は任意の文字列を書き込みます。
fwrite()
関数はバイナリデータを書き込むのに適しています。
fputc()
関数は1文字ファイルに書き込みます。あまり使い道が浮かびません。
ファイルを閉じる
fclose()
関数でファイルを閉じます。開いたファイルは絶対に閉じましょう。
#include <cstdio>
#include <iostream>
int main() {
FILE* fp = fopen("file_name.txt", "r"); // 読み込みモードで開く
if (fp == nullptr) {
std::cout << "ファイルを開けませんでした" << std::endl;
return -1;
}
fclose(fp);
}
C++でのファイル操作まとめ
上記で紹介した以外にも、WindowsAPIを使用する方法やBoostライブラリを使用する方法もあります。
今回は、標準的な方法でのファイル操作方法の紹介となります。
C++環境で、わざわざC言語スタイルのファイル操作を使う必要は無いと思いますが、覚えておくと多少の応用が効くかもしれません。