2017-02-25 65 views
-2

我正在做一個簡單的C版本的貓。C - 打開/閱讀推送垃圾

一切正常,但當我在做prinf時,它會附加一些垃圾。

這是什麼/爲什麼?

#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代碼。

不得不放一些更多的文字,因爲我得到它看起來像你的文章是motly代碼,請添加一些更多的細節。

+0

請理解[mcve](/ help/mcve)的含義 - 這意味着在發佈您的問題之前,您需要刪除所有不必要的代碼和評論。至於錯誤,'read'返回一個不是以0結尾的字符串,所以你不能在'printf(「%s」)''中使用它。例如用'write(1,buffer,n)'替換你的printf。 –

+0

@AnttiHaapala 1是stdout?其他選項應該加入和\ 0到緩衝區? –

回答

1

來自read的緩衝區未以NULL結尾,因此無法使用printf("%s", buffer)進行打印,因爲當對應於%s的字符串未以NULL結尾時,行爲未定義。

一種選擇是具有1024 + 1個字符的緩衝液:

char buffer[1024 + 1]; 

然後讀取1024個字符到它

n = read(f, buffer, 1024) 

和零終止它:

buffer[n] = 0; 

但是Unix工具經常是h andle空字符輸入,在這種情況下,沒有理由不來,所以你可以使用fwritewrite寫的n個字節,例如

fwrite(buffer, 1, n, stdout); 

write(STDOUT_FILENO, buffer, n);