0

私はこのコードをc ++で持っています(ファイルから十分なデータを読み取れない理由を確認するためにいくつかのテストを行った後なので、最終的なコードではなく、この結果が得られる理由を見つけようとしています)

size_t readSize=629312;
_rawImageFile.seekg(0,ifstream::end);
size_t s=_rawImageFile.tellg();
char *buffer=(char*) malloc(readSize);
_rawImageFile.seekg(0);
int p=_rawImageFile.tellg();
_rawImageFile.read(buffer,readSize);
size_t extracted = _rawImageFile.gcount();
cout << "s="<< s <<endl;
cout << "p="<< p <<endl;
cout << "readsize="<< readSize<<endl;
cout << "extracted="<< extracted <<endl;
cout << "eof ="<< _rawImageFile.eofbit<<endl;
cout << "fail="<< _rawImageFile.failbit <<endl;

出力は次のとおりです。

s=3493940224
p=0
readsize=629312
extracted=2085
eof =1
fail=2

ご覧のとおり、ファイル サイズは 3493940224 で、ファイルの先頭 (p=0) にいて、629312 バイトを読み取ろうとしていますが、2085 しか読み取れませんか?

このコードの問題は何ですか? このファイルを他の方法で開き、そこからいくつかのデータを読み取りましたが、seekg を使用してポインターをファイルの先頭に移動しています。

ファイルはバイナリとして開かれました。

編集 1

解決策を見つけるために、すべてのコードを関数内に配置しました。これは次のとおりです。

    _config=config;
    ifstream t_rawImageFile;
    t_rawImageFile.open(rawImageFileName,std::ifstream::in || std::ios::binary );
    t_rawImageFile.seekg (0);
    size_t readSize=629312;
    t_rawImageFile.seekg(0,ifstream::end);
    size_t s=t_rawImageFile.tellg();
    char *buffer=(char*) malloc(readSize);
    t_rawImageFile.seekg(0);
    size_t p=t_rawImageFile.tellg();
    t_rawImageFile.read(buffer,readSize);
    size_t x=t_rawImageFile.tellg();
    size_t extracted = t_rawImageFile.gcount();
    cout << "s="<< s <<endl;
    cout << "p="<< p <<endl;
    cout << "x="<< x <<endl;
    cout << "readsize="<< readSize<<endl;
    cout << "extracted="<< extracted <<endl;
    cout << "eof ="<< t_rawImageFile.eof()<<endl;
cout << "fail="<< t_rawImageFile.fail() <<endl;

結果は次のとおりです。

s=3493940224
p=0
x=4294967295
readsize=629312
extracted=2085
eof =1
fail=1

興味深いことに、読み取り後、ファイル ポインターは非常に大きな値に移動します。ファイルサイズが非常に大きいため、アプリケーションが失敗する可能性はありますか?

編集 2

別のファイルで同じコードをテストしました。結果は次のとおりです。

s=2993007872
p=0
x=4294967295
readsize=629312
extracted=1859
eof =1
fail=1

このテストから読み取れることは次のとおりです。読み取り後、ファイル ポインターは常に同じ大きな数値に移動します。読み込む量はファイル (!) によって異なります。

編集 3

size_t を fstream::pos_type に変更すると、結果は次のようになります。

s=2993007872
p=0
x=-1
readsize=629312
extracted=1859
eof =1
fail=1

読み取り後にファイル位置が -1 になるのはなぜですか?

4

3 に答える 3

1

ファイルが開かれている部分は表示されませんがios::binary、C ランタイム コードが CTRL-Z (または CTRL-D) をファイルの終わりとして解釈しないことを確認するために欠落していると確信しています。

于 2013-05-31T11:48:14.903 に答える