如何完全读取文件,一次一个字符?

时间:2014-09-07 14:41:02

标签: c file file-io

我正在尝试使用以下代码一次完全读取一个文件:

void readfile (FILE *fp, char *buf)
{
    char *c = buf;
    while (fscanf(fp, "%c", c) == 1);
}

int main (int argc, const char *argv[])
{
    char *contents = (char *)malloc(1000);

    FILE *file = fopen(argv[1], "r");
    readfile(file, contents);
    fclose(file);

    printf("%s", contents);
    free(contents);

    return 0;
}

当我用适当的参数运行它时,我看不到任何输出。我知道我正在成功读取文件,因为当我打印每个字符时,我看到文件的内容,如下所示:

void readfile (FILE *fp, char *buf)
{
    char *c = buf;
    while (fscanf(fp, "%c", c) == 1)
        printf("%c", *c);
}

我似乎无法获得contents的价值。

4 个答案:

答案 0 :(得分:0)

您没有在以下行中增加c。因此,您正在阅读并将整个文件写入单个char

    while (fscanf(fp, "%c", c) == 1);

答案 1 :(得分:0)

变化:

void readfile (FILE *fp, char *buf)
{
    char *c = buf;
    while (fscanf(fp, "%c", c) == 1); 
}

成:

void readfile (FILE *fp, char *buf)
{
    char *c = buf;
    while (fscanf(fp, "%c", c) == 1) ++c; 
    //                               ^^^
}

Q&部分:

  

我知道我正在成功读取文件,因为当我打印每个字符时,我看到了文件的内容[...]

您反复打印缓冲区的相同位置中的字符。也就是说,您不会增加存储以下字符的指针。每次后续调用fscanf都会覆盖buf[0]

答案 2 :(得分:0)

您正在替换' c'指向的字符数据。每次循环运行!! 继承人修复: `

void readfile (FILE *fp, char *buf)
{
    char *c = buf;
    while (fscanf(fp, "%c", c++) == 1); // increment the pointer.
    *c = 0; // marking null at end of string
}

`

答案 3 :(得分:0)

使用char *c = buf;,您可以为缓冲区中的第一个元素分配先前分配的缓冲区的起始地址,因此始终为fscanf。您应该尝试使用while (fscanf(fp, "%c", c++) == 1)

替换您的地址来增加地址