2013-01-03 8 views
5

これは簡単な答えですが、ファイルストリームの読み書き操作でポインタを移動させるのが簡単です。例として:fstreamはファイルポインタを読み書きします

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 []は関係なく、この方法は、同じ内容を含んでいないが使用されている(私が見ることができません最初の方法は効率的ですので、正解ははいと思っています)。そうであれば、書き込み操作でも同じ動作が見られますか?

答えて

5

はい、それは動作する方法です。あなたの例は全く同じではありません。あなたの最初の例は、10000、次に10001、そして10002などを読み込みます。2番目の例は、初期位置を設定するためにループの外側でシークする必要があります。 100%と同等であるために、あなたはあなたの第二の例は次のようになり持っている必要があります。

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

申し訳ありませんが、私は知っています - 私はループ内でシークされていないことを単に示していました。確認していただきありがとうございます。 – mlewis54

1

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

ファイルストリームを検索すると、ストリームを読み取りまたは書き込みを継続できる状態に設定されます。シーク。したがって、各ストリームは利用可能なバッファを面白い方法で設定します。これはストリームが単に文字のシーケンスを読み書きするだけで済みます。また、各シークを書き込む際には、コード変換のための初期状態になるために文字を書く必要があるかどうかを少なくともチェックする。

関連する問題