下面是我的简单猫问题,它读取一个文件并在终端上打印它。当我将 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;
}
最佳答案
不要在这里使用strlen
;您在这里不处理以 null 结尾的字符串。您阅读了固定的 block 大小。您应该写入与阅读的相同数量的字符。
fread
返回已成功读取的给定大小的元素数。在调用 fread
时使用此信息。为此,您必须将数据视为 BUFSIZE
字节,而不是一 block 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);
关于c - 带 fread 和 fwrite 的 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25940957/