我正在嘗試使用 C 讀取磁盤的引導扇區。我計劃修改代碼以將其用于其他磁盤,例如 USB 閃存驅動器。我試過這段代碼作為測驗:
#include<stdio.h>
#include<unistd.h>
int main(){
FILE *fp;
char buf[512];
fp = fopen("\\\\.\\PhysicalDrive0", "rb");
int r = fread(buf, 1, 512, fp);
printf("Elements read: %s", r);
sleep(3);
fclose(fp);
return 0;
}
當我編譯并運行它時,我得到(字面意思)Elements read: (null). 如果我以管理員身份運行它,我會得到Elements read: .
為什么我無法正確讀取引導扇區,如何修復代碼?
使用 MinGW GCC 在 Win10 上運行。
uj5u.com熱心網友回復:
首先,r是讀取的字符數,您將其視為指向 C 樣式字串的指標。為了有機會作業,您需要將buf, not傳遞r給您的printf呼叫,或更改%s為%d以便列印整數值,而不是將其視為指向字串的指標。失敗的讀取(當您缺少權限時)回傳 0,這printf有助于顯示為(null)而不是 segfaulting;成功的讀取回傳一個整數,當它被視為一個指標時,它指向一個可能幾乎不可讀的垃圾地址,但碰巧只包含NUL字符,所以什么都不會列印。
其次,假設您想查看資料,而不僅僅是讀取讀取的位元組數,引導扇區很NUL可能會在早期包含字符,這將導致%s掃描假定字串已經完成。如果您想查看資料,可以fwrite將其保存到其他檔案中進行檢查,或者將其逐個字符編碼為十六進制并將其寫入以stdout供人類閱讀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481999.html
上一篇:如何獲得當前選擇的鉛筆套件顏色?
