c - fread 跳过前 8 个字符

标签 c file-io fread

我正在尝试读取包含以下内容的 hello.ms 文件:

Hello World!

使用此 C 代码:

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

int store_file(char* file_dir, char** buffer)
{
    FILE* file;
    long lSize;
    size_t result;
    char* tempBuffer;

    file = fopen(file_dir, "r");
    if (file==NULL)
    {
        fputs("File error.", stderr);
        exit(1);
    }

    fseek(file, 0, SEEK_END);
    lSize = ftell(file);
    rewind(file);

    tempBuffer = (char*)malloc(sizeof(char)*lSize);
    if (tempBuffer == NULL)
    {
        fputs("Memory error.", stderr);
        exit(2);
    }

    result = fread(tempBuffer, 1, lSize, file);
    if (result != lSize)
    {
        fputs("Reading error.", stderr);
        exit(3);
    }

    *buffer = tempBuffer;
    free(tempBuffer);
    fclose(file);

    return lSize;
}

void fsa_cycle(char* file_dir)
{
    char* buffer;
    int bufferSize = store_file(file_dir, &buffer);

    fwrite(buffer, sizeof(char), bufferSize, stdout);
}

int main(int argc, char* argv[])
{
    if(argc < 2)
    {
        printf("\nSyntax: %s <file-name>\n\n", argv[0]);
        exit(1);
    }

    fsa_cycle(argv[1]);

    return 0;
}

它编译得很好。没有警告或错误。但它只输出 rld!

当我向 hello.ms 文件添加 8 个空格时,它会显示为 Hello World!

谁能告诉我为什么会这样?我尝试编写 fseek(file, 0, SEEK_CUR) 而不是 rewind 但这也不起作用。我在 Google 上找不到任何帮助,但没有提示程序员忘记使用 fseek 来开始。任何帮助都会很棒!

最佳答案

您正在使用 free 释放 tempBuffer 内存,但该内存块实际上已分配给 buffer

free不同的编译器可能会有所不同,但我的和你的一样,只需删除 free(tempBuffer);

关于c - fread 跳过前 8 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17686062/

相关文章:

java - 替代 Java 6 中的 Files#copy()

C - 在阅读之前找到文件结尾

c - 缓冲区大小有限的缓冲区溢出攻击

c - 在C中有效地初始化结构内部的指针

image - 删除图像文件 yii

java - 使用 RandomAccessFile 在具有大量数据的文件中插入 header 的最有效方法

r - R中的fread会将一个大的.csv文件作为具有一行的数据框导入

c - 使用指针写入和读取(fwrite - fread)结构

c - 奇怪的指针初始化

c - 如何判断逻辑表达式是否等价