下面是我的简单猫问题,它读取文件并在终端上打印。当我将BUFISZE宏设置为10时,它工作正常。如果我将BUFSIZE设置为100,它将打印部分文件。如果我将BUFIZE设置为1024,它什么都不打印。你能解释一下发生了什么吗?
#include <stdio.h>
#include <string.h>
#define BUFSIZE 10
int main(int argc, char **argv){
char buf[BUFSIZE];
FILE *fp;
if( (fp = fopen(*++argv, "r")) == NULL){
printf("cannot open %s\n", *argv);
return 1;
}
while( fread(buf, BUFSIZE, 1, fp) == 1 )
if (fwrite(buf,strlen(buf), 1, stdout) != 1 ){
printf("write error.\n");
return 2;
}
printf("\n");
return 0;
}
答案 0 :(得分:2)
此处不要使用strlen
;你不是在这里处理以null结尾的字符串。你读固定块。你应该写下你读过的相同数量的字符。
fread
返回已成功读取的给定大小的元素数。在致电fread
时使用此信息。为此,您必须将数据视为BUFSIZE
个字节,而不是一个BUFSIZE
个字节的块。 (如果这听起来很深奥:在fread
和fwrite
中交换第二个和第三个参数。这些函数不能返回大于第三个参数的数字,即元素数。)
所以:
char buf[BUFSIZE];
size_t n;
do {
n = fread(buf, 1, BUFSIZE, stdin);
if (n > 0) fwrite(buf, 1, n, stdout);
} while (n == BUFSIZE);