我想将文件读入缓冲区。我在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 );
}
答案 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()
。