c++istringstreamから文字を読み出す(2)

16667 ワード

get、getline、read
get
  • single character
    int get();
    istream& get (char& c);
    
    機能:ストリームから単一文字を抽出します.文字(最初のメソッド)を返すか、パラメータの値(2番目のメソッド)に設定します.
  • c-string
    istream& get (char* s, streamsize n);
    istream& get (char* s, streamsize n, char delim);
    
    は、ストリームから文字を抽出し、c文字列としてsに格納する、(n-1)文字を抽出するか、境界文字に遭遇するまで:境界文字は改行文字('n')またはdelim(このパラメータが指定されている場合)です.区切り文字が見つかった場合、入力シーケンスから抽出されるのではなく、ストリームから抽出する次の文字として保持されます.(セパレータの削除の代替方法についてはgetlineを参照).nがゼロより大きい場合、空の文字列が抽出されても、書き込みのシーケンスに空の文字('0')が自動的に追加されます.
  • stream buffer
    istream& get (streambuf& sb);
    istream& get (streambuf& sb, char delim);
    
    ストリームから文字を抽出し、ストリームバッファオブジェクトsb制御の出力シーケンスに挿入します.挿入に失敗したり、入力シーケンスで境界文字に遭遇したりすると、このパラメータが指定されている場合は、停止します(境界文字が改行されている場合).ストリームからsbに正常に挿入された文字のみが抽出されます.入力シーケンスから境界文字が抽出されず、最終的にsbに挿入された文字が入力シーケンスから抽出されず、次のストリームから抽出される文字として保持されません.
  • サンプル:
        std::string s("25Hello5World#Test");
        std::istringstream iss(s);
        // get
        // get single character
        std::cout << iss.get() << std::endl;
        std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
        char c;
        iss.get(c);
        std::cout << c << std::endl;
        std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
        // get c-string
        char str[10];
        iss.get(str, 6);
        std::cout << str << std::endl;
        std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
        iss.get(str, 8, '#');
        std::cout << str << std::endl;
        std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
    

    出力:
    50 iss.tellg(): 1 5 iss.tellg(): 2 Hello iss.tellg(): 7
    World iss.tellg(): 12
    getline
    istream& getline (char* s, streamsize n );
    istream& getline (char* s, streamsize n, char delim );
    

    ストリームから未フォーマットの入力として文字を抽出し、抽出した文字が境界文字であるか、終了した空の文字を含むn文字がsに書き込まれるまでc文字列としてsに格納する.
    区切り文字は、1番目の形式の改行記号(’n’)、2番目の形式はdelimです.入力シーケンスで見つかった場合、入力シーケンスから抽出されますが、sに書き込まれずに破棄されます.
    ファイルの最後に達すると、関数は文字の抽出を停止します.この要件が早すぎる場合(n文字を書き込むかdelimを見つける前に)、この関数はeofbitフラグを設定します.
    関数に文字が抽出されていない場合、または(n-1)文字がsに書き込まれた場合、区切り文字が見つからない場合はfailbitフラグが設定されます.入力シーケンスに(n-1)文字が境界文字である場合、その文字も抽出され、障害ビットフラグは設定されていません(抽出シーケンスはちょうどn文字長です).
    nがゼロより大きい場合、空の文字列が抽出されても、書き込まれたシーケンスの後に空の文字('0')が自動的に追加されます.
    内部では、noskipwsをtrueに設定した哨兵オブジェクトを最初に構築することによって入力シーケンスにアクセスします.その後(良好であれば)、メンバー関数sbumpcまたはsgetcを呼び出すように、関連するストリームバッファオブジェクトから文字が抽出され、最終的には戻る前に哨兵オブジェクトが破棄されます.
    この関数の読み取りと格納に成功した文字数には、メンバーgcountを呼び出すことでアクセスできます.
    サンプル:
        std::string s("25HelloWorld#Test");
        std::istringstream iss(s);
        // getline
        iss.seekg(0);
        char strLine[256];
        iss.getline(strLine, 256);
        std::cout << strLine << std::endl;
        std::cout << "getline gcount: " << iss.gcount() << std::endl;
        std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
        
    

    出力:
    25HelloWorld#Test getline gcount: 17 iss.tellg(): -1
    read
    istream& read (char* s, streamsize n);
    

    Read block of data
    ストリームからn文字を抽出し、sが指す配列に格納します.
    この関数は、データ・ブロックのみをコピーし、その内容を確認したり、末尾に空の文字を追加したりしません.
    n文字の読み取りに成功する前に、入力シーケンスが抽出する文字(すなわち、ファイルの最後に到達する)を使い切った場合、sが指す配列は、その点まで読み出されるすべての文字を含み、eofbitとストリームに障害ビットフラグが設定される.
    内部では、noskipwsをtrueに設定した哨兵オブジェクトを最初に構築することによって入力シーケンスにアクセスします.その後(良好であれば)、メンバー関数sbumpcまたはsgetcを呼び出すように、関連するストリームバッファオブジェクトから文字が抽出され、最終的には戻る前に哨兵オブジェクトが破棄されます.
    この関数の読み取りと格納に成功した文字数には、メンバーgcountを呼び出すことでアクセスできます.
    サンプル:
        std::string s("25HelloWorld#Test");
        std::istringstream iss(s);    
    	// read
        iss.seekg(0);
        std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
        //char* buff = new char[256];
        char buff[256] = {0}; //     
        iss.read(buff, 256);
        std::cout << buff << std::endl;
        std::cout << "getline gcount: " << iss.gcount() << std::endl;
        std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
    

    出力:
    iss.tellg(): 0 25HelloWorld#Test getline gcount: 17 iss.tellg(): -1
    まとめ
    ストリームからデータを読み込むにはoperator>>を使用します.粒度が太く、arithmetic types(算術タイプ)の場合、文字セットは対応するタイプ値に変換されます(ここでは時間がかかります).
    get、getline、readを使用してバイト数で取得します.(binaryストレージおよび読み取り用に使用されることが多い)