basic_ios::tieは、同期する出力ストリームを設定または取得する。
basic_ios::tie - cpprefjp C++日本語リファレンス
basic_ios.cppで、
// ヘッダのインクルード #include <iostream> // C++標準入出力 #include <fstream> // C++ファイル入出力 #include <string> // std::string // main関数 int main(){ // test.txtへ書き込む用のファイルストリーム. std::basic_ofstream<char> ofs("test.txt"); // std::basic_ofstream<char>のofsで"test.txt"を開く. // test.txtを読み込む用のファイルストリーム. std::basic_ifstream<char> ifs("test.txt"); // std::basic_ifstream<char>のifsで"test.txt"を開く. // test.txtに"ABCDE"を出力. ofs << "ABCDE"; // 出力演算子でofsに"ABCDE"を出力. // ifsで読み込む. std::string str; // ifsの内容を格納するstd::stringオブジェクトstr. if (ifs >> str){ // 入力演算子でifsで読み込んだ内容をstrに格納する.(失敗した場合, 括弧内は偽となる.) std::cout << "str = " << str << std::endl; // strを出力. } else{ // 失敗の場合. std::cout << "(ifs >> str) failed!" << std::endl; // "(ifs >> str) failed!"と出力. } // プログラムの終了 return 0; // 正常終了 }
同じファイルのファイル書き込みストリームとファイル読み込みストリームを同時に用意し、書き込んだ後、瞬時に読み込むような処理を書くと、
書き込んだ後の読み込みに失敗する。
これは、出力してもフラッシュしないと入力できないからであり、
// ヘッダのインクルード #include <iostream> // C++標準入出力 #include <fstream> // C++ファイル入出力 #include <string> // std::string // main関数 int main(){ // test.txtへ書き込む用のファイルストリーム. std::basic_ofstream<char> ofs("test.txt"); // std::basic_ofstream<char>のofsで"test.txt"を開く. // test.txtを読み込む用のファイルストリーム. std::basic_ifstream<char> ifs("test.txt"); // std::basic_ifstream<char>のifsで"test.txt"を開く. // test.txtに"ABCDE"を出力. ofs << "ABCDE"; // 出力演算子でofsに"ABCDE"を出力. // ofsをフラッシュ. ofs.flush(); // std::basic_ostream::flushでフラッシュ. // ifsで読み込む. std::string str; // ifsの内容を格納するstd::stringオブジェクトstr. if (ifs >> str){ // 入力演算子でifsで読み込んだ内容をstrに格納する.(失敗した場合, 括弧内は偽となる.) std::cout << "str = " << str << std::endl; // strを出力. } else{ // 失敗の場合. std::cout << "(ifs >> str) failed!" << std::endl; // "(ifs >> str) failed!"と出力. } // プログラムの終了 return 0; // 正常終了 }
書き込んだ後にフラッシュをすると、
読み込める。
この出力及びフラッシュと入力を同期させるのがbasic_ios::tieで、
このように、basic_ios::tieで、ifsとofsを紐づけると、
明示的にflushしなくても読み込める。
Sample/cpp/basic_ios/tie/src/basic_ios at master · bg1bgst333/Sample · GitHub