1

概括

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

fseek到文件的末尾然后ftell找到长度以便将长度用于fread.

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

问题是,rewind()由于某种原因,使用返回错误。

请注意,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
4

2 回答 2

3

需要内存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);
}
于 2020-12-07T15:05:51.237 回答
1

问题的根源是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

于 2020-12-07T15:08:54.263 回答