-2

システムコールのみを使用して、 catおよびnlに相当するコマンドである C でコーディングする必要がある場所を実行する演習があります。与えられたシステム コールは、open()、close()、read()、および write() です。

「cat」に相当するものは既に実行しており、正常に動作しているようです。「nl」を実行する必要がありますが、行ごとに記述する方法に問題があります。

考えられるのは、可能な限り少ないシステム コールを使用することです。

バッファで「\n」を見つける必要があることはわかっています。バッファをループして「\n」の位置を見つけ(Xと呼びましょう)、X個のバイトを標準出力に書き込むことができます。

しかし、バッファ内のすべての文字をループして行末を検索するのは私には適切ではありませんが、他にどのようにこれを行うことができるかわかりません...

重要な編集:
私の質問のポイントを見逃している人もいると思います...これを行う方法についての説明は必要ありません。それは私の問題ではありません。私はそれを行う方法を知っています (または非常に良いアイデアを持っています。まだ試していません)。「問題」は、行の終わりを見つけるために、バッファ、ファイル、またはその他のものを1文字ずつループするのが正しくないと感じることです(方法は関係ありません)。これが答えではないと言っているわけではありませんし、これを行うことは許可されていないと言っているのではありません。これを行うのは奇妙な方法のように思えます。それだけです...しかし、それが方法である場合、それが私の質問に対する答えです。

でも、みんなの助けに感謝します:)

4

5 に答える 5

6

バッファを検索する必要がありますが\n、それを回避する方法はありません。パフォーマンスについて心配する必要はありません。プログラムはほとんどの時間をreadとで費やしwriteます。

また、バッファーを十分に大きくするようにしてください。read(file,&c,1)信じられないほど遅くなるので、電話しないでください。

于 2009-04-15T20:35:27.640 に答える
3

'\n' を見つける唯一の方法は、検索することです。を使用できない場合はstrchr(3)、探しているものを見つけるためにバッファーを反復処理する必要があります (読み取り: 実装してください)。

于 2009-04-15T20:32:46.913 に答える
1

非常に大まかな概要:

  • に置き換えることができますgetc(file)read(file,&c,1)ファイルを引数として受け取り、文字を返す関数を書くだけです。文字をローカル変数に読み込み、それを返します。

  • 次に、以下を実装しgetline(file)ます: バッファを作成し、一度に 1 文字ずつ読み込みを開始し、'\n'(空き容量がなくなったらどうしますか?) になったら停止し、バッファへのポインタを返します (どのようにこれが機能するためのバッファ?)。

  • あなたgetlineを使って一度に 1 行ずつ読んでから、行番号と行を書きます。

  • ファイルがなくなるまでループします...


システムコールを減らすには:

ファイル全体を一度に大きなバッファーに読み込みます---ファイルサイズがあれば非常に簡単です---一度に1文字ずつ調べて、行の開始と終了を見つけます(2つのポインターを使用します)。

于 2009-04-15T20:18:40.160 に答える
1

行の長さが事前にわからない場合、\n の場所を見つけるための近道はありません。つまり、行を分割するために簡単に実装された関数を使用しない限り、おそらくどこかで同じことを行うだけです。

つまり、はい、文字をループする必要があります:)

于 2009-04-15T20:20:37.910 に答える
0

'\n'行に番号を付けるために、実際にの場所を知る必要はありません。行番号(1から始まる)を印刷し、改行がヒットするまで文字を読みます'\n'。各文字をコピーしてstdoutに戻しwrite()ます。文字が改行の場合は、現在の行数をインクリメントして、それも出力します。

于 2009-04-15T20:28:40.433 に答える