std::fstream クラスの tellg() 関数で問題が発生しました。通常、入力ストリーム内の現在の文字の位置を返す必要があります。しかし、それは私にとって非常に奇妙に機能します。以下は、いくつかの短いサンプル コードです。
#include <iostream>
#include <fstream>
using namespace std;
int main(void) {
char c;
ifstream czytaj;
czytaj.open("test_file.txt");
cout << czytaj.tellg() << endl; //is 0 should be 0
czytaj.peek(); //is 0 should be 0
cout << czytaj.tellg() << endl; //is 2 should be 0 !!
czytaj.get(c); //is 3 should be 3
czytaj.get(c); //is 4 should be 4
cout << czytaj.tellg() << endl; //is 6 should be 4 !!
int r; cin >> r;
return 0;
}
txt ファイルは次のようになります。
abcdefghij
kturjbkfvd
コンパイル後、次のような出力が得られます。
0
2
6
tellg() の最初の使用は正しく機能し、ファイルの先頭として位置 0 を返します。残念ながら、次の各使用は、位置に +2 を追加するように機能します。その結果、ストリームから文字 'c' と 'd' が抽出されます。tellg() と peek() はどちらも位置を変更しないと想定されているため、文字 'a' と 'b' を取得する必要がありますが、正しい結果は次のようになります。
0
0
2
txtファイルでエンコードANSIを使用すると、このようなことが起こります。Unicode に変更すると、正常に動作します。また、ANSI とさらにバイナリ モードの ios::binary を使用すると、適切に動作します。奇妙な事実は、私の他のコンピューターでは、ANSI があり、ios::binary がなくても正常に動作することです。なぜそれが起こるのですか?
編集:非常に重要な事実について言及するのを忘れていました。このサンプル コードから を含むすべての行を削除するtellg()
と、抽出は正しく行われ、文字 'a' と 'b' が得られます。