2017-02-25 8 views
-2

私はcatのシンプルなCバージョンをやっています。C - ゴミ箱を開いて読む

すべてが機能しますが、私はprinfを行っているときにそのゴミを追加しています。

what/whyは何ですか?

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

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

    FILE *fp; 
    int i,n; 
    char ch; 
    int f; 
    char buffer[1024]; 

    //nao foi especificado nenhum ficheiro 
    if(argc<2){ 
      printf("usar mycat <ficheiro> \n"); 
      return 0; 
    } 


     for(i=1; i<argc;i++){ 
     //fp = fopen(argv[i],"r"); 
     f = open(argv[i], O_RDONLY); 
     //Nao existe ficheiro 
     //if(f == NULL) { 
     if(f == -1) { 
     printf("%s: Nao existe esse ficheiro\n", argv[i]); 
      return 0; 
      } 

     /* 
     while((ch=fgetc(fp)) != EOF){ 
     putchar(ch); 
      } 
     */ 
     while((n=read(f,buffer,1024)) > 0) { 
      printf("%s",buffer); 
     } 
     //fclose(f); 
     close(f); 

     } 


    return 1; 
} 

コメントされているfopenコードを無視します。

あなたの投稿がモチーフのコードであるように見えるので、もう少し詳細を追加してください。 readから

+0

何を理解してください。 [mcve](/ help/mcve)とは、質問を投稿する前に不要なコードとコメントをすべて削除する必要があるということです。エラーの場合、 'read'は0で終了しない文字列を返します。したがって' printf( "%s") 'でそれを使うことはできません。 printfを 'write(1、buffer、n);に置き換えてください。 –

+0

@AnttiHaapalaは1が標準ですか?他のオプションはバッファに\ 0を追加すべきですか? –

答えて

1

バッファがヌルで終了されないが、%sに対応する文字列がヌル終了でない場合の動作が定義されていないので、それはprintf("%s", buffer)で印刷することができません。

一つのオプションは、1024 + 1文字のバッファを有することである。

char buffer[1024 + 1]; 

次いで

n = read(f, buffer, 1024) 

、それをゼロ終了それに1024個の文字を読み取る:

buffer[n] = 0; 

しかし、Unixのツールはしばしばh andle入力中にヌル文字が、この場合には存在しないとする理由はほとんどですので、あなたがそれらのnバイトを書き込むことがfwriteまたはwriteを使用することができ、例えば

fwrite(buffer, 1, n, stdout); 

または

write(STDOUT_FILENO, buffer, n); 
関連する問題