while(fscanf != EOF) ループでコードを実行しています。ただし、fscanf の実行が終了しても、いくつかの条件が満たされるまでそのコードを実行し続ける必要があります。コードをコピーして while(fscanf) ループの外側に貼り付け、グローバル変数のみを使用できると思いますが、それは面倒です。確かに、誰かが以前にこのようなことに遭遇し、よりクリーンなソリューションを持っています。
4 に答える
whileこれらの追加の条件を考慮して条件を変更することはできませんか?
while(fscanf(...) != EOF || !(some_other_conditions_met))
よりクリーンなソリューションはscanf/の使用を避けfscanfます。一度に行全体を読み取り、代わりに行を解析すると、エラーが発生しにくくなりますsscanf。
comp.lang.c FAQ から:なぜ誰もが scanf を使用しないと言うのですか? 代わりに何を使用すればよいですか?
feof使用に関するエントリも関連します。
できません - feof() 関数は、読み取り操作の後にファイルの終わりの状態をテストするだけです- 次の操作が失敗するかどうかをテストする方法はありません。C ストリーム I/O は、求めているものを直接サポートしていないため、プログラムのロジックを変更する必要があります。
あなたの質問のタイトルに対する答えは、それはかなり不可能だということです。乱数を取得し、2 つのフォーマット文字列のどちらを fscanf に渡すかを決定することを想像してみてください。乱数がどうなるかさえわからないときに fscanf が eof を取得するかどうかを事前に予測したいですか?
あなたの質問の本文に対する答えは、多かれ少なかれ Andreas Brinck が書いたものです。ただし、次のようなものがもっと必要になるかもしれないと感じています。
for (;;)
{
// .....
eofReached = (fscanf(..) == EOF);
// .....
if (eofReached && otherConditionsMet) break;
// .....
}