【C++】基本的なファイル操作について【忘備録】

スポンサーリンク
homeimageC++
スポンサーリンク

はじめに

自分用の忘備録。且つ、もしかしたら誰かの役に立てばいいなーという感じで。

プログラミングの正しさとかは全く考慮せずに書くので、案件とかの時はリファレンスちゃんと調べて読むように。

「string」ヘッダを読み込んで「string」型を利用すると簡単にできるので、今回はこれを使って読み込みをする。また、ファイル操作をするために「fstream」ヘッダを用いる。

ファイルの読み込み

ファイルを開く

読み込むファイルは次のようにして開くことができる。

std::ifstream オブジェクト名(ファイルの場所);

尚、ファイルの場所はプログラムのある場所から見た相対パス。もしくは絶対パスで指定する。

具体的には次の通り。

#include <iostream>
#include <fstream>

int main(){

	std::ifstream ifs("input.txt"); //入力ファイルストリーム
	
	return 0;
}

簡単に説明すると、入力ファイルストリームオブジェクト「ifs」を作成し、そこに「input.txt」を紐づけている。

これによって「ifs」を呼ぶことで「input.txt」の内容にアクセスできるようになる。

ここで、「ifs」は「input.txt」をエディタなどで開いているとした場合に、カーソルの位置を示しているものだと考えて良い。

また、カーソルを進められる場合には「1」、進めることができない場合には「0」を値として持っている。(要するにカーソルより後ろにデータがあれば「1」、なければ「0」である。)

区切り毎に読み込む

入力ファイルストリームは標準入力ストリームと同じく「>>」演算子を使うことができる。

具体的には次のように書くことができる。

#include <iostream>
#include <string>
#include <fstream>

int main(){

	std::ifstream ifs("input.txt"); //入力ファイルストリーム
	
	std::string str; //string型変数strの宣言
	
	ifs >> str; //ifsからstrにデータを格納
	
	std::cout << str << std::endl; //標準出力
	
	return 0;
}

例えば次のようなファイル「input.txt」がプログラムと同じ場所にあるとする。

Hello World!
Name Ktora
Age 21
BirthDay 1 13

プログラムを実行すると

Hello

と表示される。

これは標準入力の際と同じく、空白を区切りとみなすためである。

そのため、ファイルに書かれている全ての文字列を取得したい場合には、プログラムを次のように書き換える。

#include <iostream>
#include <string>
#include <fstream>

int main(){

	std::ifstream ifs("input.txt"); //入力ファイルストリーム
	
	std::string str; //string型変数strの宣言
	
	while(ifs){ //最終点に達するまで
	
		ifs >> str; //ifsからstrにデータを格納
		std::cout << str << std::endl; //標準出力
	}
	
	return 0;
}

このプログラムを実行すると、結果は次のようになる。

Hello
World!
Name
Ktora
Age
21
BirthDay
1
13

またwhile文の条件に「ifs」と書いてある。

これは最初に「ifs」をカーソルの位置と表現したが、「>>」演算子などを用いてファイルからデータを取り出すと、取り出した分カーソルの位置は進む。

ここでカーソルが進められる状態にある場合には「1」を返し、カーソルの位置を進めることができなくなると「0」を返すことから、このような使い方をすることが可能である。

ただし、ファイルを開くことができなかった場合にも「0」となるため、fail関数を使うことを推奨する。

fail関数

fail関数はファイルを開くことができなかった場合に「1」を返す関数で次のようにして使うことができる。

オブジェクト名.fail()

具体的には次のようにして使う。

#include <iostream>
#include <fstream>

int main(){

	std::ifstream ifs("input.txt"); //入力ファイルストリーム
	
	if(ifs.fail()){
		std::cout << "error" << std::endl;
	}

 	return 0;
}

一行ごとに読み込む

一行毎に読み込む場合にはstd::getline関数を用いて次のようにすれば良い。

std::getline(ファイルストリームオブジェクト名,string型変数)

具体的には次のようなプログラムになる。

#include <iostream>
#include <string>
#include <fstream>

int main(){

	std::ifstream ifs("input.txt"); //入力ファイルストリーム
	
	std::string str; //string型変数strの宣言
	
	std::getline(ifs,str); //ifsから一行取り出してstrに格納
	
	std::cout << str << std::endl; //標準出力
	
	return 0;
}

先ほどの「inputs.txt」を同じ場所において実行すると、結果は次のようになる。

Hello World!

またgetline関数は一行取り出せた場合には「1」を取り出せなかった場合には「0」を返す。

これを使うと次のようにすることで全文を取り出せる。

#include <iostream>
#include <string>
#include <fstream>

int main(){

	std::ifstream ifs("input.txt"); //入力ファイルストリーム
	
	std::string str; //string型変数strの宣言
	
	while(std::getline(ifs,str)){ //ifsから一行取り出してstrに格納 getlineが1であればループ
	
		std::cout << str << std::endl; //標準出力
	}
	
	return 0;
}

プログラムの実行結果は次のようになる。

Hello World!
Name Ktora
Age 21
BirthDay 1 13

ファイルの読み込みは基本的にこの二つの方法を用いて行う。

ファイルへの書き込み

ファイルを開く

ファイルを書き込む際にもファイルを開く必要があり、次のようにして開くことができる。

std::ofstream オブジェクト名(ファイル);

具体的には次の通り。

#include <iostream>
#include <fstream>

int main(){

	std::ofstream ofs("output.txt"); //出力ファイルストリーム
 
 	return 0;
}

簡単に説明すると、出力ファイルストリームオブジェクト「ofs」を作成し、そこに「output.txt」を紐づけている。

これによって「ofs」を呼ぶことで「output.txt」に書き込むことができるようになる。

入力ファイルストリームと同様に「ofs」もマウスカーソルのようなものと考えて良い。

また、出力ファイルとして指定したファイルがない場合には作成される。

ファイルに書き込む

出力ファイルストリームは標準出力ストリームと同じく「<<」演算子を使うことができる。

具体的には次のように書くことができる。

#include <iostream>
#include <fstream>

int main(){

	std::ofstream ofs("output.txt"); //出力ファイルストリーム
	
	ofs << "Hello World!";
 
 	return 0;
}

これを実行すると、プログラムと同じ場所に「output.txt」が作られ内容が次のようになる。

Hello World!

尚、「output.txt」が既に存在した場合には、書き込んだ時点で内容を破棄する。

最後に

今回はここまで。

長くなりそうなので、残りは別の記事で。

忘備録なのに。

こちらに出力ファイル操作について書いたのでぜひ。

コメント

タイトルとURLをコピーしました