2017-05-21 24 views
-3

"cache.txt"というファイルがあります。ここにいくつかのデータがあります。私はunordered_map、cacheを持っていて、値のintの組を持ちます。ペアの最初の要素は、読みたい文字数を表し、2番目の要素は読みたい位置を表します。 unordered_mapのキー、compsは関係ありません。ファイルからの読み込み - C

.... 
fp = fopen("cache.txt", "r"); 
fseek(fp, cache[comps].second, SEEK_SET); 
int number_of_chars = cache[comps].first; 
char c; 
while((c = getc(fp)) != EOF && number_of_chars > 0) { 
    --number_of_chars; 
    printf("%c",c); 
} 
fclose(fp); 

私はそれを数回使用する必要があります。そのため、毎回ファイルを開いたり閉じたりする理由があります。

+0

毎回開閉する必要はありません。開いているハンドルに 'fseek'を何度も何度もやってください。 –

+0

これは質問よりも文に似ています。クールな話。しかし何を尋ねようとしていたのですか? –

+0

具体的な質問を追加してください。 –

答えて

0

テキストストリームを使用している(とあなたがモード"r"ではなくファイル"rb"を開くので、どうやらあなたは、ある)場合、あなたはfseekに渡すことができる唯一の位置の値が0またはftellで返されるいくつかの値です。言い換えれば、あなたは文字を数えることはできず、fseekへの呼び出しでその数を使用することはできません。

バイナリストリームを使用する場合は、読んだバイト数を自分で数えることができますが、OSが改行を表すために使用するものは改行文字に変換されないという事実に対処する必要があります。与えられたOSが改行をどのように扱うかを知る方法がないので、バイナリモードでテキストストリームを移植可能に読むことは不可能です。

要するに、C標準ライブラリの要件を真摯に受け止めてください。マップに保存しているオフセットがftellへのコールから直接得られていることを確認してください。 (「直接」とはftell(file) + 1を使用することもできません。ftell(file)のみ)

UNIXとLinuxのプログラマは、テキストとバイナリモードに違いがないことを要求しているため、上記の問題に対処できません。 fseekは、ワイドストリームに対してftellによって返される値を使用する必要があります。しかし、Windowsを使用している場合は、fseekを使用して自分で計算したバイト位置に戻ることはできません。 Windowsを使用していない場合は、いつかあなたのプログラムがいつかWindowsに移植されるかどうかを尋ねるべきです。

関連する問題