簡體   English   中英

使用fread()和fseek()

[英]working with fread() and fseek()

我有一個已存儲到HDD的彩虹表。 我正在讀取文件,並嘗試將其傳輸到結構。 我還有另一個轉儲可執行文件,顯示了Rainbow表中的所有結構。 為了測試fread()和fseak(),我在要查看的特定索引中找到了一個結構,但是當我得到全0時。

我認為我使用fseek錯誤。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct data {
    unsigned char a[16];
    char b[20];
} data;

int main(int argc, char **argv){

    FILE *f = fopen( *(argv + 1), "rb");
    data e = { .a = ""};

    fseek(f, 35929 * sizeof(struct data), SEEK_SET);
    fread(&e, sizeof(struct data), 1, f);

    printf("%s\n", e.a);

    return 0;
}

使用fseek不能立即表明為什么要讀取文件中請求的偏移量的所有零。 但是,實際上沒有任何辦法可以說明問題所在,因為到目前為止,還沒有驗證任何關鍵操作成功或失敗的代碼。 無法判斷失敗是由於無法打開 f 導致的,還是文件是否包含足以支持您的偏移量的字節,或者fseekfread在該偏移量處是否成功或失敗,等等。

要開始了解問題所在,必須驗證直到printf為止的每個必要操作。 至少那么,您將有一些合理的想法,在通過調試器運行代碼之前,您的代碼將失敗。 (不得)

解決問題(以及正確的代碼驗證)的一個很好的第一步是檢查每個調用函數的返回,以確保其成功執行,並根據需要進一步驗證值的合理性。 所需的最低驗證的示例類似於:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct data {
    unsigned char a[16];
    char b[20];
} data;

int main(int argc, char **argv){

    FILE *f = fopen (argv[1], "rb");
    data e = { .a = {0}, .b = {0} };
    long int size = 0;

    if (!f) {
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    if (fseek (f, 0, SEEK_END)) {
        fprintf (stderr, "error: fseek SEEK_END failed\n.");
        return 1;    
    }
    if ((size = ftell (f)) == -1){
        fprintf (stderr, "error: ftell failed to return size of file\n.");
        return 1;    
    }

    rewind (f);

    if ((unsigned long)size < 35929 * sizeof e) {
        fprintf (stderr, "error: offset exceeds file size '%ld'\n.", size);
        return 1;    
    }

    if (fseek (f, 35929 * sizeof e, SEEK_SET)) {
        fprintf (stderr, "error: fseek SEEK_SET failed\n.");
        return 1;    
    }

    if (!fread (&e, sizeof e, 1, f)) {
        fprintf (stderr, "error: fread failed to read data into 'e'\n.");
        return 1;    
    }

    printf("%s\n", e.a);

    fclose (f);

    return 0;
}

請嘗試一下,並提供其他信息,並進行報告,這里的每個人都很樂意為您提供任何其他幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM