fgets读取特定大小

时间:2011-10-29 02:41:42

标签: c input fopen fgets

我正在尝试编写一个程序,从命令行给出的文件名中读取一定数量的字符。这就是我所拥有的:

#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个字符,但这也不起作用。开头的一些东西是读的,但事后没有,它只是给了我一堆空白。知道什么是错的吗?

由于

3 个答案:

答案 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个字符;它会在每个换行符处停止,而你不关心一次读一行。