1

C では、入力から一部の行だけをスキャンして、プログラムの実行時間を節約したいと考えています。例:

入力ファイルに次のような乱数が含まれているとします。

5 1
1 2
1 7
5 6
3 4
1 6
2 5 3
1 5 4
3 1 1

ここでは、double にあるすべての数字をスキップして、triple にある数字から始めたいと思います。

2 5 3
1 5 4
3 1 1

途中からスキャンを開始するように scanf() をリダイレクトできますか?

4

2 に答える 2

2

fseekスキップする必要のあるバイト数がわかっている場合は、この関数を使用して、ファイルカーソルをファイル内の任意のオフセットにジャンプできます。

スキップする必要のある文字数が事前にわからない場合は、ファイルから行を継続的に読み取り、条件に一致しない行をスキップするのが最善の方法です。あなたの場合、スペース文字が1つしかないすべての行をスキップし、スペースが2つある行を見つけたら読み取りを再開できます。

お役に立てれば!

于 2013-02-07T23:02:22.947 に答える
2

必要なものに到達するまで、データを読み取って無視することができます。たとえば、で行を読み取り、fgetsを使用sscanfしてその行を3つの数値に変換してみます。からの戻り値sscanfが3でない場合、3つの数値を変換できなかったため、次の行に進みます。が3を返す場合sscanf、結果を配列(またはその他)に保存できます。

ファイルの後半のポイントに本当にスキップするには、スキップ先のオフセットを知って、それをにフィードする必要がありますfseek。ただし、ここでは当てはまらないようです。

ファイルが大きく 2つの数直線とそれに続く3つの数直線だけで構成されていることが(確かに)わかっている場合は、バイナリ検索のような方法で最初の3つの数直線を見つけることができます。まず、ファイルの長さを見つけてから、ファイルの途中(約)を探します。1行を読んで無視します(おそらく行の先頭を探していなかったため)。次に、次の行を読んで、上記のように変換してみてください。3つの数字がある場合は、3つの数直線が始まった時点を過ぎているので、最初の半分くらいまでやり直してください(2つの数字の線しかない場合は、最後の半分まで)。

おそらくこれを長く続けたくないでしょう-3つの数直線の先頭から数キロバイト(またはそれくらい)以内にいるときは、代わりに先頭が見つかるまで順番に読む方がおそらく速いでしょう。正確に正しいポイントを見つけるためにもっと多くのことをしています。

于 2013-02-07T23:03:05.007 に答える