2

ファイルを読み込んで、それを STDOUT に出力する必要がありますが、ダブル スペースが必要です。私がこれまでに持っているものは次のとおりです。

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define BUFSZ 1024

int main(int argc, char* argv[]){

int n, fdin;
char buf[BUFSZ];

if ((fdin=open(argv[1],O_RDONLY))<0){
  perror(argv[1]);
  exit(-1);
}
while(( n = read(fdin, buf, BUFSZ))>0){
 if(write(STDOUT_FILENO,buf,n) != n){
  fprintf(stderr, "Write Error\n");
  exit(-1);
 }
 printf("\n");
}
close(fdin);
return(0);
}

私は C に不慣れで、\n をコードに実装する方法がわかりません。私の printf("\n") は、ファイルの内容全体を 2 倍にしようとしても役に立ちません。\n を読み取りに追加する必要があると思いますか? しかし、それが正しいかどうか、またはそれを行う方法は完全にはわかりません。

4

3 に答える 3

7

read()改行文字に遭遇しても読み取りを停止しないため、投稿されたコードのアルゴリズムは、read()複数の行を読み取る可能性があるため、空白行の書き込みを簡単に見逃す可能性があります。

より簡単なアプローチでは、次を使用しますfgets()

FILE* f = fopen(argv[1], "r");
if (f)
{
    char buf[BUFSZ];
    while (fgets(buf, BUFSZ, f))
    {
        printf("%s", buf);

        /* fgets() may not have read a full line if the
           length of the line was greater than BUFSZ,
           so check it did before double spacing. */
        if (strrchr(buf, '\n')) printf("\n");
    }
    fclose(f);
}
于 2012-11-01T22:27:55.930 に答える
2

openclosereadおよびwrite関数は Unix (実際には POSIX) に固有のものです。C 言語標準では、より高度な関数セット ( fopenfclose、および多くの入出力関数) が提供されており、ここでそれらを使用しない正当な理由はありません。POSIX 固有の関数を持つシステムには、標準の C 関数があります。逆は必ずしも真ではありません。

完全なソリューションのコードを提供する必要があるかどうかはわかりませんが (これは宿題ですか?)、簡単な概要を説明します。

行全体を読み書きする必要はありません。この問題は、1 文字だけを読み書きすることで簡単に解決できます。また、C の I/O 関数は暗黙的なバッファリングを行うため、重大なパフォーマンスの問題は発生しません。

「行」は、改行'\n'文字で終了する一連の文字です。(Windows で使用されているような異なる行末表現について心配する必要はありません\r\n。ファイルをテキスト モードで開くと、C ライブラリが C の内部'\n'表現との間の変換を処理します。)

入力ファイルから一度に 1 文字ずつ読み取ります。読み取った文字ごとに、同じ文字を標準出力に書き込みます。さらに、入力文字が の場合、標準出力に'\n'を書き込みます。 '\n'

一度に行全体をメモリに読み込む必要がある同様の問題があります (つまり、行の長さを気にする必要があります) が、この特定の問題では必要ありません。

于 2012-11-01T22:47:43.360 に答える
1

fgets puts と putc を使用すると、はるかに単純でバッファリングされます。fgets は行を読み取り、

int main(int argc, char* argv[]){
    FILE *fp;
    char *s;
    char buf[BUFSZ];
    if ((fp = fopen(argv[1],"r")) == NULL) {
        fprintf(stderr, "Error opening %s\n", argv[1] );
        exit(-1);
    }
    while((s = fgets(buf, sizeof buf, fp)) != NULL){
        puts(s);
        putchar('\n');
    }
    fclose(fp);
    return(0);
}
于 2012-11-01T22:29:28.557 に答える