0

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' が得られます。

4

2 に答える 2

1

同じ問題がありました。filestream バイナリの読み取りを試みます。

    czytaj.open("test_file.txt",ios::binary);

それは私を助けました

于 2016-08-31T13:45:40.197 に答える