簡體   English   中英

一次讀取一個二進制文件1個字節

[英]Reading a binary file 1 byte at a time

我試圖一次讀取C 1字節的二進制文件,並在搜索互聯網幾個小時后仍然無法檢索除垃圾和/或seg故障之外的任何內容。 基本上,二進制文件的格式為256項長度,每個項目為1個字節(0到255之間的無符號整數)。 我試圖使用fseek和fread跳轉到二進制文件中的“索引”並檢索該值。 我目前的代碼:

unsigned int buffer;

int index = 3; // any index value

size_t indexOffset = 256 * index;
fseek(file, indexOffset, SEEK_SET);
fread(&buffer, 256, 1, file);

printf("%d\n", buffer);

現在這段代碼給了我隨機的垃圾數字和段錯誤。 有關如何使其正常工作的任何提示?

在您的代碼中,您嘗試將256個字節讀取到一個int的地址。 如果你想一次讀取一個字節,請調用fread(&buffer, 1, 1, file); (見fread )。

但更簡單的解決方案是聲明一個字節數組,一起讀取並在此之后處理它。

你的令人困惑的字節int 字節的常用術語是unsigned char 大多數字節都是8位寬。 如果您正在讀取的數據是8位,則需要讀取8位:

#define BUFFER_SIZE 256

unsigned char buffer[BUFFER_SIZE];

/* Read in 256 8-bit numbers into the buffer */
size_t bytes_read = 0;
bytes_read = fread(buffer, sizeof(unsigned char), BUFFER_SIZE, file_ptr);
// Note: sizeof(unsigned char) is for emphasis

將所有數據讀入存儲器的原因是為了保持I / O流動。 無論請求的數量如何,每個輸入請求都會產生開銷。 一次讀一個字節,或一次尋找一個位置是最壞的情況。

以下是讀取1個字節所需的開銷示例:

Tell OS to read from the file.
OS searches to find the file location.
OS tells disk drive to power up.
OS waits for disk drive to get up to speed.
OS tells disk drive to position to the correct track and sector.
-->OS tells disk to read one byte and put into drive buffer.
OS fetches data from drive buffer.
Disk spins down to a stop.
OS returns 1 byte to your program.

在您的程序設計中,上述步驟將重復256次。 根據每個人的建議,標有“ - >”的行將讀取256個字節。 因此,開銷僅執行一次而不是256次以獲得相同數量的數據。

unsigned char buffer; // note: 1 byte
fread(&buffer, 1, 1, file);

現在是時候閱讀我相信的人。

您正在嘗試將256個字節讀入一個名為“buffer”的4字節整數變量中。 您正在覆蓋其他252個字節的其他數據。

似乎buffer應該是unsigned char buffer[256]; 或者你應該做fread(&buffer, 1, 1, f) ,在這種情況下buffer應該是unsigned char buffer;

或者,如果你只想要一個字符,你可以將buffer保留為int (不需要unsigned ,因為C99保證了普通int的合理最小范圍)並簡單地說:

buffer = fgetc(f);

幾個問題與代碼,因為它站立。

fread的原型是:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

您已將大小設置為256(字節)並將計數設置為1.這很好,這意味着“讀取一個256字節的塊,將其推入緩沖區”。

但是,您的緩沖區大約為2-8個字節(或者,至少遠小於256個字節),因此您有一個緩沖區溢出。 您可能想要使用fred(&buffer,1,1,file)。

此外,您正在將字節數據寫入int指針。 這將適用於一個endian-ness(實際上是小端),因此你可以在英特爾架構上做得很好,並從中學習壞習慣,這些日子會回來咬你。

嘗試很難將字節數據寫入字節組織存儲,而不是寫入整數或浮點數。

暫無
暫無

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

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