使用 rewind() returns 一个错误,删除它允许代码 运行 正常

Using rewind() returns an error, removing it allows code to run fine

总结

我正在尝试创建一个将文件内容转换为字符串的程序。

fseek到文件末尾然后ftell找到长度,以便使用fread的长度。

问题是,我必须fseek回到文件的开头才能从头读取,否则它会从文件的末尾开始读取,这显然是一个问题。

问题是,使用 rewind() returns 由于某种原因出错。

请注意,从我的代码中删除 rewind() 行允许它 运行 没有错误,但是 (null) 被打印出来,因为它是从文件末尾读取的。这就是为什么我假设 rewind() 是问题所在。

代码

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE* dictionary = fopen("test.txt", "r");
    fseek(dictionary, 0, SEEK_END);
    int len = ftell(dictionary);
    rewind(dictionary);

    char* txt;
    fread(txt, len+1, 1, dictionary);
    printf("%s", txt);
}

错误信息

shell returned 139

txt需要内存:

变化:

 char* txt;
 fread(txt, len+1, 1, dictionary);
 printf("%s", txt);

char* txt = malloc(len+1);
if(txt)
{
    fread(txt, len, 1, dictionary);
    txt[len] = 0;//add terminating NULL
    printf("%s", txt);
    free(txt);
}

问题的根源在于 fread() 试图将文件中的数据写入 txt,但 txt 并未指向分配的内存。这是修复它的一种方法:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE* dictionary = fopen("test.txt", "r");
    fseek(dictionary, 0, SEEK_END);
    int len = ftell(dictionary);
    rewind(dictionary);

    char *txt = malloc(len);
    fread(txt, len, 1, dictionary);
    printf("%s", txt);
}

我认为这在删除 rewind() 时有效,因为 fread 在写入 txt 中的无效指针之前到达文件末尾。