FREAD C指针问题

时间:2011-04-22 21:12:05

标签: c pointers fread

嗨,我有一个非常令人沮丧的问题,指针可能有人让我知道我在这里做错了什么。 感谢

// This functions reads from the file 
void get__data_block_from_disk(char* ptr, int block_num){
    int file_desc;
    int x;
    open_fs(file_path);
    file_desc = fileno(fileptr);
    x = lseek(file_desc, DATA_BLOCK_OFFSET + block_num*BLOCK_SIZE, SEEK_SET);
    fread(&ptr, BLOCK_SIZE, 1, fileptr);
    close_fs();
}

// This function writes to the file
void place__data_block_into_disk(char* ptr, int block_num){
    int file_desc;
    int x;
    printf("char in place: %c\n", ptr);
    open_fs(file_path);
    file_desc = fileno(fileptr);
    x = lseek(file_desc, DATA_BLOCK_OFFSET + block_num*BLOCK_SIZE, SEEK_SET);
    fwrite(ptr, BLOCK_SIZE, 1, fileptr);
    close_fs();
}

3 个答案:

答案 0 :(得分:4)

问题是你写的

fread(&ptr, BLOCK_SIZE, 1, fileptr);

你想要的地方:

fread(ptr, BLOCK_SIZE, 1, fileptr);

这是一个问题的原因是ptr作为get__data_block_from_disk提供给char *。因此,我假设ptr指向旨在接收结果的内存。 (我希望你已经指出了足够的内存,但你没有提供这种情况的调用代码列表。)

鉴于ptr已经是一个指向你想要读取文件数据的内存的指针,它就是你提供给fread的指针。通过写ptr来提供&ptr的地址,您建议fread()覆盖存储ptr的内存和任何相邻变量。毫无疑问,这不是你想要的。

如果您错误地使用C ++编译器编译C代码,请停止。但是如果你是,请注意C ++编译器会抱怨从reinterpret_cast<>ptr缺少char *投射void *

答案 1 :(得分:3)

想要混合lseek和fread。如果在文件描述符上使用lseek,请在文件描述符上使用read。如果你在FILE *上使用fread,请在FILE *上使用fseek。混合两者几乎肯定不会给你你想要的东西。

答案 2 :(得分:2)

fread(&ptr, BLOCK_SIZE, 1, fileptr); 

应该是

fread(ptr, BLOCK_SIZE, 1, fileptr);

或改为

void get__data_block_from_disk(char* ptr, int block_num){

void get__data_block_from_disk(char** ptr, int block_num){

fread(&ptr, BLOCK_SIZE, 1, fileptr); 

fread(*ptr, BLOCK_SIZE, 1, fileptr);

说明:

Fread第一个参数应该是一个指针,当你写&amp; ptr时,你会发送指针内存地址。