C 中的 fseek 和 fread 问题

问题描述 投票:0回答:1

我在 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)的第二天输入的内容,我像往常一样将其复制粘贴到文本文件中。除非有必要,否则我不会分享它,因为这样做不是一个好习惯。

c file fread fseek
1个回答
0
投票

在评论的帮助下,我发现了两个问题: 第一个是:当我应该以二进制方式读取文件时,我以文本方式读取文件。 第二个是:我没有正确放置空终止符。

我最终使用的代码是:

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;
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.