将文件读入缓冲区,但在调用fseek后程序在fread崩溃

时间:2015-07-24 06:38:26

标签: c file-io segmentation-fault fread fseek

我想将文件读入缓冲区。我在fread()得到了分段错误。看起来ftell()会给出正确的尺寸。但事情出了问题。 fseek()会修改f吗?为什么fread()不起作用?

int pk_load_file( const char *filename )
{
    FILE *f;
    int size;
    unsigned char *buf;

    if( ( f = fopen( filename, "rb" ) ) == NULL )
        return -1;

    fseek( f, 0, SEEK_END );

    if( ( size = ftell( f ) ) == -1 )
    {
        fclose( f );
        return -2;
    }

    fseek( f, 0, SEEK_SET );

    if( fread( buf, 1, size, f ) != size )
    {
        fclose( f );
        return -3;
    }

    fclose( f );

    return( 0 );
 }

3 个答案:

答案 0 :(得分:1)

这里的问题是

$(document).delegate('#index-page', 'pagebeforeshow', function(){
    PopulateMainLocations();
});

在上述情况下,您使用if( fread( buf, 1, size, f ) != size ) 未初始化。在使用之前,您需要将内存分配给buf

未初始化时,buf可以指向进程无法访问的任何内存位置。因此,尝试访问buf指向的内存会调用undefined behaviour

分割错误是副作用之一。

解决方案:您可以使用malloc()和家人将内存分配给buf

答案 1 :(得分:0)

正确的代码:

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

int pk_load_file( const char *filename ) {
    FILE *f;
    int size;
    unsigned char *buf;

    if ((f = fopen(filename, "rb")) == NULL) {
        return -1;
    }

    fseek(f, 0, SEEK_END);

    if ((size = ftell(f)) == -1) {
        fclose(f);
        return -2;
    }

    buf = malloc(size); // here is the magic. you need to allocate "size" bytes

    if (buf == NULL) {
        fclose(f);
        return -3;
    }

    fseek(f, 0, SEEK_SET);

    if (fread(buf, 1, size, f) != size) {
        fclose(f);
        return -4;
    }

    fclose(f);

    return 0;
}

答案 2 :(得分:0)

 unsigned char *buf;

如上所述,它给出了未定义的行为,因此要么使用动态分配,要么将其声明为数组,

 #define  MAX_LENGTH 1024
 unsigned char buf[MAX_LENGTH];

并将其传递给fread()