2017-02-25 68 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);