

ifstreamに対しtellg()とseekg()を使って、ファイルの読み込み位置を保存し、  
後でその保存位置を呼び出そうとしました  
しかし、読み取り位置が想定とずれるためその原因を探しています

読み込みファイル(text.txt)

[code]

    helloworld
    
[/code]

ソース

[code]

    #include <fstream>
    #include <iostream>
    #include <typeinfo>
    
    void print(std::ifstream& ifs);
    
    int main() {
      std::ifstream ifs("test.txt");
      std::streampos pos;
    
      print(ifs);
      print(ifs);
      pos = ifs.tellg();
      std::cout << "save the pos : " << pos << std::endl;
      print(ifs);
      print(ifs);
      print(ifs);
      ifs.seekg(pos);
      std::cout << "load the pos : " << pos << std::endl;
      print(ifs);
      print(ifs);
      print(ifs);
    
      return 0;
    }
    
    void print(std::ifstream& ifs) {
      char word = ifs.get();
      std::cout << ifs.tellg() << ": word \"" << word << "\"" << std::endl;
    }
    
[/code]

予想される結果

[code]

    2: word "h"
    3: word "e"
    save the pos : 3
    4: word "l"
    5: word "l"
    6: word "o"
    load the pos : 3
    4: word "l"
    5: word "l"
    6: word "o"
    
[/code]

実際の結果

[code]

    2: word "h"
    3: word "e"
    save the pos : 3
    4: word "l"
    5: word "l"
    6: word "o"
    load the pos : 3
    5: word "l"
    6: word "o"
    7: word "w"
    
[/code]

想定ではposが3の時にifs.get()を行うとposが4になるはずなのに、  
実際には一つ飛ばしてposが5になっています  
このずれはなぜ発生するのでしょうか？

よろしくお願いします


CC BY-SA 4.0
2020-04-19T11:24:59.353
65758
2020-06-28T11:07:30.717
39707
question
c++
ifstreamの読み取り位置がずれる


<https://stackoverflow.com/a/27089585> のように思えます。バッファを切るとどうでしょうか?

[code]

    #include <fstream>
    #include <iostream>
    #include <typeinfo>
    
    void print(std::ifstream& ifs);
    
    int main() {
      // ここから変更
      std::ifstream ifs;
      ifs.rdbuf()->pubsetbuf(nullptr, 0);
      ifs.open("test.txt");
      // ここまで変更
      std::streampos pos;
    
      print(ifs);
      print(ifs);
      pos = ifs.tellg();
      std::cout << "save the pos : " << pos << std::endl;
      print(ifs);
      print(ifs);
      print(ifs);
      ifs.seekg(pos);
      std::cout << "load the pos : " << pos << std::endl;
      print(ifs);
      print(ifs);
      print(ifs);
    
      return 0;
    }
    
    void print(std::ifstream& ifs) {
      char word = ifs.get();
      std::cout << ifs.tellg() << ": word \"" << word << "\"" << std::endl;
    }
    
[/code]


CC BY-SA 4.0
2020-04-24T08:59:24.967
65924
2020-04-24T08:59:24.967
36010
65758
answer