====== ファイル入出力 ====== * ファイル * テキストファイル * 中身は数値や文字が文字コードで、数字や文字として書かれている * 文字コードのバイト数毎にテキスト読み込み関数で呼んでいけばいいから、プログラム作るのは結構らくちん * 数の場合、数値「3.14」が「33 2e 31 34」のように文字になっているので読み込んでから「文字列」⇒「数値」の変換が必要 * 書き込みも何も考えず文字にして書くから、coutで文字を表示するのとほぼ同様に、書き込みできる * バイナリファイル * 中身は文字は文字コード、数値は数値のメモリ表現そのまま、をファイルに書き込んでいくスタイル * すべて2進数で表されているので、文字のみの場合よりファイルサイズが小さくなる場合が多い(何故かは考えてみてね) * 数の場合、、数値「3.14」がプログラム内でfloatなら「110011 101110 110001 110100」(浮動小数点形式)で書き込まれる。 * [[https://siv3d.jp/web/sample/IEEE754Float32/IEEE754Float32.html|浮動小数点シミュレータ]] * 読み込むときには、元の型が何だったかしらないと読込サイズがわからないので、読込サイズを指定しながら読み込む ==== C++とかのファイル入出力の手順 ==== * ファイル * 書き込み - オープン(ファイル指定、モード指定(しないとtext?)) - 書き込み - クローズ * 読み込み - オープン(ファイル指定、モード指定) - 読み込み - クローズ __オープンしたファイルは必ずクローズする__掟\\ C++などでは、ファイルをオープンすると、__プログラムから見たカレントフォルダ__に指定ファイルがあるか探す\\ ただし、**visual studio上からプログラムを実行**するときは、VSのプロジェクトのあるフォルダにあるファイルを探します。\\ file path(ファイルパス) 相対パス(自分のいるフォルダからの関係で指定) 絶対パス(ドライブの根っこから自分で指定) C:\Users\y.sato\source\repos\file_inout_sample フォルダ指定に注意しないと、他人に渡したときに読めなくなるよ! 1行まるっと読み込んで、テキスト解析→データに 数字は数値に 文字は文字に #include #include #include using std::cout; using std::cin; using std::string; using std::endl; using std::ofstream;//アウトプットファイルストリーム using std::ifstream;//インプットファイルストリーム int main() { //ofstream out_file;//ファイルストリームのインスタンスを作成 //string fpath = "C:\\Users\\y.sato\\source\\repos\\file_inout_sample\\"; //string fname = "output.txt"; //string openFileName = fpath + fname; //out_file.open(openFileName, std::ios::app|std::ios::out);//ストリームがオープンする //if (out_file.fail()) //{ // cout << "そんなファイルはない!" << endl; // exit(0); //} //int idata = 10; //char cdata = 's'; //float fdata = 3.14; //string str = "Hi! I'm very very happy today."; //out_file << str << endl;//ストリームにデータを流す //out_file << idata << "," << cdata << "," << fdata << endl; //out_file.close();//ストリームを閉じる ifstream input_file; //string fpath = "C:\\Users\\y.sato\\source\\repos\\file_inout_sample\\"; string fname = "output.txt"; //string openFileName = fpath + fname; input_file.open(fname, std::ios::in); if (input_file.fail())//エラー処理は大事 { cout << "ファイルオープンに失敗" << endl; exit(0); } string indata; //input_file >> indata; std::getline(input_file, indata); cout << indata; //string str1 = "3.14" //stringstream ss(str1); //double var; //ss >> var; input_file.close(); return 0; }