我在 fseek 和 fread 方面遇到问题。由于某种原因,使用
fseek (f, 0, SEEK_END);
不会给我文件末尾,而是进一步前进 1000 个字节,给我垃圾数据并且通常很痛苦......
我已经检查过,如果我用 python 打开同一个文件, f=open("filename","r"); print(len(f.read()))
会给我正确的结果,但是在我之前写的行之后在 C 中使用 ftell()
将会关闭 1000,我不知道为什么。
这是不起作用的功能的完整代码:
char* get_input(const char* path) {
char* buffer = NULL;
FILE* f = fopen(path, "r");
if (f)
{
fseek (f, 0, SEEK_END);
const long length = ftell(f);
fseek (f, 0, SEEK_SET);
printf("%d\n", length);
buffer = malloc(length+1);
if (buffer)
{
fread (buffer, 1, length, f);
buffer[length+1] = '\0';
}
fclose (f);
}
return buffer;
}
(它只是试图将文件的内容作为字符数组读取......) 我尝试打开的文件只是我在代码出现(2024)的第二天输入的内容,我像往常一样将其复制粘贴到文本文件中。除非有必要,否则我不会分享它,因为这样做不是一个好习惯。
在评论的帮助下,我发现了两个问题: 第一个是:当我应该以二进制方式读取文件时,我以文本方式读取文件。 第二个是:我没有正确放置空终止符。
我最终使用的代码是:
char* get_input(const char* path) {
char* buffer = NULL;
FILE* f = fopen(path, "rb");
if (f)
{
fseek (f, 0, SEEK_END);
const long length = ftell(f);
fseek (f, 0, SEEK_SET);
buffer = malloc(length+1);
if (buffer)
{
size_t bytes = fread (buffer, 1, length, f);
buffer[bytes] = '\0';
}
fclose (f);
}
return buffer;
}