C - 打开/读取垃圾

时间:2017-02-25 19:19:31

标签: c

我正在做一个简单的C版本的猫。

一切正常,但是当我在做这个时,它会附加一些垃圾。

是什么/为什么?

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

1 个答案:

答案 0 :(得分:2)

来自read的缓冲区不是以空值终止的,并且无法使用printf("%s", buffer)打印,因为当%s对应的字符串未以空值终止时,行为未定义。

一个选项是拥有1024 + 1个字符的缓冲区:

char buffer[1024 + 1];

然后读入1024个字符

n = read(f, buffer, 1024)

并将其终止:

buffer[n] = 0;

但Unix工具经常在输入中处理空字符,在这种情况下没有理由不这样做,因此您可以使用fwritewrite来写入这些n个字节,例如< / p>

fwrite(buffer, 1, n, stdout);

write(STDOUT_FILENO, buffer, n);