我正在尝试编写一个程序,从命令行给出的文件名中读取一定数量的字符。这就是我所拥有的:
#include <stdio.h>
int main(int argc, char **argv)
{
int i = 0;
FILE *f;
char* fileName = argv[1];
char buf[40];
f = fopen(fileName, "r");
while(!feof(f)){
fgets(buf, 10, f);
printf("%s\n", buf);
}
fclose(f);
return 1;
}
在这种特殊情况下说我需要前10个字符,然后是接下来的10个字符等,直到文件结束。但是,当我运行此代码时,它实际上并没有给我正确的输出。我试过11,因为文档说fgets()读取n-1个字符,但这也不起作用。开头的一些东西是读的,但事后没有,它只是给了我一堆空白。知道什么是错的吗?
由于
答案 0 :(得分:0)
您正在寻找的功能是fread
,如下所示:
fread(buf, 10, 1, f);
答案 1 :(得分:0)
fgets
旨在读取一行,最大长度。如果您想一次读取10个字符,无论换行如何,您可能希望改为使用fread
:
无论哪种方式,你肯定不想要使用while (!feof(f))
。你可能想要这样的东西:
int main(int argc, char **argv) {
char buf[40];
FILE *f;
if (NULL == (f=fopen(argv[1], "r"))) {
fprintf(stderr, "Unable to open file\n");
return EXIT_FAILURE;
}
size_t len;
while (0 < (len=fread(buf, 10, 1, f)))
printf("%*.*s\n", len, len, buf);
return 0;
}
答案 2 :(得分:0)
如果从\n
格式字符串中删除printf
(假设您希望基本上按原样回显整个文件),它几乎可以正常工作。
我还会根据fgets(...) != NULL
进行循环,因为feof()
会在 fgets
错误后返回一个真值并点击EOF,所以你的最后一个缓冲区将会满打印两次。您可以对代码进行一些小改动:
#include <stdio.h>
int main(int argc, char **argv)
{
int i = 0;
FILE *f;
char* fileName = argv[1];
char buf[40];
f = fopen(fileName, "r");
while(fgets(buf, 10, f))
printf("%s", buf);
fclose(f);
return 0;
}
另外,正如其他人所说,虽然我花了太长时间才回答,fread
可能是更好的选择,因为fgets
不一定会读取10个字符;它会在每个换行符处停止,而你不关心一次读一行。