考慮すべき追加の代替案。あなたの質問へのコメントには、いくつかの良い点が言及されています。以下の例では、さまざまなコメントを収集し、30バイトを読み込み、最初の20バイトを出力ファイルに書き込むための簡潔な方法を示します。
のマジックナンバー(コード全体にハードコードされた値を振りかざす)は使用しないでください。
#include <stdio.h>
enum { WRTSZ = 20, BUFSZ = 30 };
int main (int argc, char **argv) {
if (argc < 3) {
fprintf (stderr, "error: insufficient input, usage: %s ifile ofile\n",
argv[0]);
return 1;
}
FILE *ifp = fopen (argv[1], "rb");
FILE *ofp = fopen (argv[2], "w+");
char buf[BUFSZ] = "";
if (!ifp) { /* validate file open for reading (binary) */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
if (!ofp) { /* valdate file open for writing */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
/* read BUFSZ bytes (require at least WRTSZ), and output */
while (fread (buf, sizeof *buf, BUFSZ, ifp) >= WRTSZ)
if (fwrite (buf, sizeof *buf, WRTSZ, ofp) != WRTSZ)
fprintf (stderr, "error: fwrite of WRTSZ failed.\n");
fclose (ifp);
if (fclose (ofp)) /* validate close of output file */
fprintf (stderr, "error: on close of '%s'.\n", argv[2]);
return 0;
}
(注:のみフルブロックの読み取りと書き込みの両方がストリーム操作(例えばfread
、fwrite
)が代わりにread
、write
の利用されている)と、出力ファイルのclose
が検証され、検証され最後の読み取りが20バイト未満の部分読み取りである場合、その情報は出力ファイルに書き込まれません。fread
およびfwrite
を取り囲む条件を調整して、必要に応じて動作を調整できます)。
例入力ファイル(非POSIX、無EOL)
次の入力ファイルは、例示目的のためにテキストである、アリそれにはPOSIX 行末('\n'
)を含みません。
$ cat dat/ruler.txt
........10........20........30........40........50........60........70........80........90
使用/出力ファイル
$ ./bin/rd30wrt20 dat/ruler.txt dat/rulerout.txt
$ cat dat/rulerout.txt
........10........20........40........50........70........80
はそれを上に見て、私を聞かせて(あなたが好きなら、それだけで、出力ファイルに書き込まれる改行になります改行を含めることができます)あなたは何か質問がある場合は知っている。
:あなたが最後
fread
中に読み込ま任意の部分のバイトを書き込みたい場合は、次のようなものに条件文を調整することができますすべてのバイト(0 <部分バイト< = WRTSZ)
を書く
size_t rdsz; ... /* read BUFSZ bytes, write 0 < rdsz <= WRTSZ */ while ((rdsz = fread (buf, sizeof *buf, BUFSZ, ifp))) if (fwrite (buf, sizeof *buf, rdsz > WRTSZ ? WRTSZ : rdsz, ofp) != WRTSZ) fprintf (stderr, "warning: fwrite of '%zu'.\n", rdsz);
30バイトのチャンクで読み込みますが、最初の20バイトだけを使用します。 – Dummy00001
なぜCの古いスタイルを使用していますか? – MikeCAT
私の先生は古代だから。彼は赤軍でソ連のために戦ってきた。笑。 –