2011-04-22 151 views
0

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

// 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(); 
} 
+0

你预计会发生什么,你会得到什么? – 2011-04-22 21:14:08

回答

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 *

+0

谢谢你,你的解释有多大意义。 – ddd 2011-04-22 22:07:21

+0

很酷。如果这个或其他答案让你感到不安,请点击帮助答案旁边的复选标记。这标志着你的问题“回答”,并给予收件人15分。 :) – 2011-04-22 22:41:19

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第一个参数是一个指针,当你写& PTR您在指针内存ADRESS发送。

+1

第二次如何改变帮助?如果使用'* ptr'而不是'&ptr',这是有道理的,但这是相反的情况。 – 2011-04-22 21:18:44

+0

我感到困惑,当然第二个只会在* ptr而不是&ptr的时候才起作用。感谢您为我指出:) – rzetterberg 2011-04-22 21:23:27

+0

而且,假设你运行这样的函数:get__data_block_from_disk(&ptr,1); – rzetterberg 2011-04-22 21:24:55

3

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

+0

这是如此的真实。 – 2011-04-23 19:12:38