我正在做一个简单的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代码。
答案 0 :(得分:2)
来自read
的缓冲区不是以空值终止的,并且无法使用printf("%s", buffer)
打印,因为当%s
对应的字符串未以空值终止时,行为未定义。
一个选项是拥有1024 + 1个字符的缓冲区:
char buffer[1024 + 1];
然后读入1024个字符
n = read(f, buffer, 1024)
并将其终止:
buffer[n] = 0;
但Unix工具经常在输入中处理空字符,在这种情况下没有理由不这样做,因此您可以使用fwrite
或write
来写入这些n个字节,例如< / p>
fwrite(buffer, 1, n, stdout);
或
write(STDOUT_FILENO, buffer, n);