質問

信頼性の高い文字fseek操作を後戻りするfscanfを使用していますか?

私はちょうどfscanf-ED 10個の文字を持っているが、私は10個の文字を後戻りしたい場合は、

たとえばなどが、私はちょうどfseek(infile, -10, SEEK_CUR)ことができますか?

ほとんどの状況では、それは動作しますが、私は、文字^Mに問題があるように見えます。どうやらfseek charとしてそれを登録し、それをfscanf登録していない、ので、私の前の例で^Mを含む10文字ブロックではなくfseek(infile, -11, SEEK_CUR)を必要とします。 fseek(infile, -10, SEEK_CUR)は、1つの文字で短いそれをもたらすになるだろう。

これはなぜそうでしょうか?

編集:私はテキストモードでfopenを使用していた。

役に立ちましたか?

解決

あなたは「テキスト」と「バイナリ」ファイルとの違いを見ています。ファイルがテキストモード(fopenの第二引数でいない「B」)で開かれている場合は、stdioライブラリは(確かに、しなければならない)テキストファイルのオペレーティング・システムの規則に従ったファイルの内容を解釈します。例えば、Windowsでは、行が\ rをする\ nで終了し、かつ、C規約であるので、これは、標準入出力することによって、単一の\ nに変換されます。テキストファイルに書き込む場合、単一の\ n個が\ r \ nとして出力を取得します。

これは、それが簡単にテキストファイルを扱うポータブルCプログラムを書くことができます。いくつかの詳細は、しかし、複雑になる、とfseekingはそのうちの一つです。このため、Cの標準は、ほんの数例のテキストファイルでのfseekを定義しています。非常に初めに、非常に最後まで、現在の位置に、そしてftellはで取得された前の位置に。言い換えれば、あなたは、テキストファイルのために追求する位置を計算することはできません。またはすることができますが、あなたはすべてのプラットフォーム固有の詳細を自分で世話をする必要があります。

また、あなたはバイナリファイルを使用すると、改行コードの変換を自分で行うことができます。ここでも、移植性が低下します。

あなただけ戻ってあなたが最後fscancfやったどこに行きたい場合は、

あなたのケースでは、最も簡単にはftellはあなたがfscanfは直前に使用することです。

他のヒント

関数fscanfは、インテリジェントキャリッジ・リターンおよび改行が2バイトであることを処理し、1つの文字としてそれらを飲み込む一方のfseekは、バイトで動作するので、

である

FSEEKは、ファイルの中身のない理解を持っていないし、ちょうど10文字のバックファイルポインタを移動します。

関数fscanfは異なり改行を解釈することがあり、OSに依存します。それも、あなたはDOSにしていると、^ Mがファイルに表示されない場合は関数fscanfは^ Mを挿入するようになることがあります。お使いのCコンパイラに付属して、あなたのマニュアルを参照してください。

ただ、VS2008でこれを試してみましたが、関数fscanfとfseek関数は、(単一の文字など)と同じ方法で、CRとLF文字を扱うことがわかりました。

二つのファイルを持つのでます:

0000000:3132 3334 3554 3738 3930 3132 3334 3536 12345X7890123456

0000000:3132 3334 350D 0a37 3839 3031 3233 3435 12345..789012345

私は2番目の「5」に取得15個の文字を読めば、当時10個の文字を求めて、私の次の文字の読み取りは最初のケースと第二中CRLFに「X」です。

これは非常にOS /コンパイラ固有の問題のように思える。

あなたはfscanfの戻り値をテストしましたか?いくつかのコードを投稿します。

ungetc のを見てみましょう。あなたはそれをループを実行する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top