0

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

0 に答える 0