はじめに
自分用の忘備録。且つ、もしかしたら誰かの役に立てばいいなーという感じで。
プログラミングの正しさとかは全く考慮せずに書くので、案件とかの時はリファレンスちゃんと調べて読むように。
「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」が既に存在した場合には、書き込んだ時点で内容を破棄する。
最後に
今回はここまで。
長くなりそうなので、残りは別の記事で。
忘備録なのに。
こちらに出力ファイル操作について書いたのでぜひ。
コメント