编辑发现我的问题。我没有意识到 fseek 的 origin 参数的唯一允许值是 SEEK_SET SEEK_CUR 和 SEEK_END,所以我将调用更改为 fseek(diskPointer, startOfData, SEEK_SET);
我有一个打开的文件以二进制模式读写,所以我在文件上使用 fseek、fread 和 fwrite。在整个代码中调用 fwrite 之前,我使用 fseek 将文件指针设置到正确的位置,但似乎 fseek 失败并返回非零值。fseek 失败可能有哪些原因?
这是我的函数,它应该将“值”写入文件。该值正在写入,但在文件的开头而不是我希望 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);
}