6

これは簡単な質問ですが、簡単に答えられるといいのですが、ファイル ストリームの読み取り操作と書き込み操作によってポインターが移動しますか? 例として:

cpos=10000;
for (i=0;i<20;i++) {
   dataFile.seekg(cpos+i,ios::beg);
   dataFile.read(carray[i],1);
}

それは(論理的に)同一ですか:

dataFile.seekg(cpos,ios::beg);    
cpos=10000;
for (i=0;i<20;i++) {
    dataFile.read(carray[i],1);
}

つまり、carray[] には、どのメソッドを使用しても同じ内容が含まれていますか (最初のメソッドが効率的であるとは思えないので、正しい答えが「はい」であることを願っています)。もしそうなら、書き込み操作でも同じ動作が見られますか?

4

2 に答える 2

5

はい、それがその仕組みです。ただし、あなたの例はまったく同じではありません。最初の例では、10000、次に 10001、次に 10002 などを読み取ります。2 番目の例では、初期位置を設定するためにループの外側でシークが必要です。100% 同等にするには、2 番目の例を次のようにする必要があります。

cpos=10000;
dataFile.seekg(cpos,ios::beg);
for (i=0;i<20;i++) {
   dataFile.read(carray[i],1);
}
于 2013-01-03T22:27:01.020 に答える
2

はい、ファイル ポインタは読み取りおよび書き込み操作によって自動的に移動されます。...シークしないと、パフォーマンスが大幅に向上します。また、を 20 回使用するよりも、使用する方がはるかに高速です。ただし、同じセマンティクスを取得するには、1 回のシークを使用して適切な場所に移動する必要があります。file.read(ptr, 20)file.read(ptr + i, 1)

ファイル ストリームをシークすると、文字の読み取りと書き込みの両方を継続できる状態にストリームが設定されます。読み取り/書き込みモード ( ) で開かれたストリームの読み取りと書き込みを切り替えるにstd::ios_base::in | std::ios_base::outは、シークを導入する必要があります。このように、ストリームが一連の文字を読み書きするだけの場合、ストリームが行う必要のない面白い方法で利用可能なバッファを設定します。また、各シークを書き込むときに、コード変換の初期状態に入るために文字を書き込む必要があるかどうかを少なくともチェックします。

于 2013-01-03T22:27:34.207 に答える