編集私の問題を発見しました。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);
}