fread跳过前8个字符

时间:2013-07-16 20:11:24

标签: 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(文件,0,SEEK_CUR)而不是倒带,但这也不起作用。我找不到谷歌的任何帮助,并没有暗示程序员忘记使用fseek来开始。任何帮助都会很棒!

4 个答案:

答案 0 :(得分:3)

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

free可能与不同的编译器有所不同,但我的工作与您的一样,只需删除free(tempBuffer);

答案 1 :(得分:2)

您过早释放缓冲区 使用缓冲区后应释放内存。这一行:

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

答案 2 :(得分:1)

我在gdb中运行它并且在free(tempBuffer)之后出现问题;

(GDB) 31 if(result!= lSize)

(gdb)print tmpBuffer

当前上下文中没有符号“tmpBuffer”。

(gdb)print tempBuffer

$ 3 = 0x602250“Hello World!\ n”

(gdb)n

37 * buffer = tempBuffer;

(gdb)

38 free(tempBuffer);

(gdb)打印缓冲区

$ 4 =(char **)0x7fffffffe180

(gdb)print * buffer

$ 5 = 0x602250“Hello World!\ n”

(gdb)n

39 fclose(file);

(gdb)

41返回lSize;

(gdb)print * buffer

$ 6 = 0x602250“”

(gdb)print tempBuffer

$ 7 = 0x602250“”

答案 3 :(得分:0)

尝试以这种方式使用

    char *buff;
buff = calloc(sizeOfFileInBytes + 1, sizeof(char));//replace sizeOfFileInBytes with file size (use stat to get file size)
if (!buff) {
    printf("error : %s", strerror(errno));
    fclose(f);
}
fread(buff, sizeOfFileInBytes, 1, f);

fclose(f);
printf("%s\n", (char *) buff);//lets echo what we get from fread;
free(buff);//lets return memory to heap