edit 发现我的问题 . 我没有意识到fseek的origin参数的唯一允许值是SEEK_SET SEEK_CUR和SEEK_END,所以我把我的调用改为fseek(diskPointer,startOfData,SEEK_SET);

我有一个文件打开以读取和写入二进制模式,所以我在文件上使用fseek,fread和fwrite . 在整个代码中调用fwrite之前,我使用fseek将文件指针设置到正确的位置,但似乎fseek失败并返回非零值 . fseek失败的原因是什么?

这是我的函数,它应该为文件写'value' . 正在写入值,但是在文件的开头而不是我希望fseek让我去的位置 . 'startOfData'是一个常量,表示我正在尝试写入的扇区 .

int writeToData(int position, char *value){
if(!fseek(diskPointer, 0, startOfData)){
    if (fwrite(value, sizeof(value), 1, diskPointer) != 1) {
    return 0;
    }
    return 1;
    }
return 0;
}

这是main(上面的writeToData函数由下面的createroot函数调用):

#define startOfData 405504
int main(int argc, char *argv[]){
char *filepath;
int clearDisk;
if (argc != 3) {
    printf("Usage: ./a.out [filepath of virtual disk] [0 to clear disk before use, any other number otherwise]\n");
}
else {
    filepath = argv[1];
    clearDisk = atoi(argv[2]);
}

//The virtual disk is opened for reading and writing
diskPointer = fopen(filepath, "r+b");

if (diskPointer != NULL) 
{
    if (clearDisk == 0) {
        initializeDisk();
        createRoot();
    }

}
else
{
    printf("Error preparing virtual disk; terminating program.\n");
    return(1);
}

我的初始化磁盘功能:

//5MB disk
void initializeDisk(){
int i;
char *buffer = "0";
for (i = 0; i < 5000000; i++) {
    fwrite(buffer, 1, 1, diskPointer);
}
rewind(diskPointer);
}