[英]Unable to get the right count of elements when reading a binary file with fread
[英]Missing values when reading using fread in a binary file
我有一個二進制文件,我在其中編寫了具有以下字段的結構
typedef struct super_bloque{
size_t s_filesystem_type;
size_t s_inodes_count;
size_t s_blocks_count;
size_t s_free_blocks_count;
size_t s_free_inodes_count;
time_t s_mtime;
time_t s_umtime;
size_t s_mnt_count;
size_t s_magic;
size_t s_inode_size;
size_t s_block_size;
size_t s_first_ino;
size_t s_first_blo;
size_t s_bm_inode_start;
size_t s_bm_block_start;
size_t s_inode_start;
size_t s_block_start;
}SUPER_BLOQUE;
我有以下方法在文件中寫入結構
void Operacion::formatear_ext2(char type, size_t part_start, size_t part_size, FILE *disco){
MBR mbr;
fseek(disco, 0, SEEK_SET);
fread(&mbr, sizeof(mbr), 1, disco);
size_t n = (size_t)floor((part_size - sizeof(SUPER_BLOQUE)) / (sizeof(I_NODO) + 3 * sizeof(BLOQUE_ARCHIVO) + 4));
printf("n = %zu\n", n);
SUPER_BLOQUE super_block;
memset(&super_block, 0, sizeof(SUPER_BLOQUE));
super_block.s_filesystem_type = (size_t)2;
super_block.s_inodes_count = n;
super_block.s_blocks_count = (size_t)3 * n;
super_block.s_free_blocks_count = (size_t)3 * n;
super_block.s_free_inodes_count = n;
super_block.s_mtime = time(0);
super_block.s_umtime = time(0);
super_block.s_mnt_count = 1;
super_block.s_magic = 0xEF53;
super_block.s_inode_size = sizeof(I_NODO);
super_block.s_block_size = sizeof(BLOQUE_ARCHIVO);
super_block.s_first_ino = 0;
super_block.s_first_blo = 0;
super_block.s_bm_inode_start = part_start + sizeof(SUPER_BLOQUE);
super_block.s_bm_block_start = part_start + sizeof(SUPER_BLOQUE) + n;
super_block.s_inode_start = part_start + sizeof(SUPER_BLOQUE) + n + 3 * n;
super_block.s_block_start = part_start + sizeof(SUPER_BLOQUE) + n + 3 * n + n * sizeof(I_NODO);
fseek(disco, part_start, SEEK_SET);
fwrite(&super_block, sizeof(SUPER_BLOQUE), 1, disco);
for(size_t i = 0; i < super_block.s_inodes_count; i++){
fseek(disco, super_block.s_first_ino + i, SEEK_SET);
fwrite("0", 1, 1, disco);
}
for(size_t i = 0; i < super_block.s_blocks_count; i++){
fseek(disco, super_block.s_first_blo + i, SEEK_SET);
fwrite("0", 1, 1, disco);
}
if(type == '1'){
size_t tam_ino_bloq = super_block.s_block_start + n * sizeof(BLOQUE_ARCHIVO);
for(size_t i = super_block.s_inode_start; i < tam_ino_bloq; i++){
fseek(disco, i, SEEK_SET);
fwrite("\0", 1, 1, disco);
}
}
然后我讀取磁盤內的結構以檢查數據是否正確存儲
fseek(disco, part_start, SEEK_SET);
fread(&tmp_sb, sizeof(SUPER_BLOQUE), 1, disco);
printf("**************************** SUPERBLOQUE ****************************\n");
printf("fs: %zu\n", tmp_sb.s_filesystem_type);
printf("i-nodes count : %zu\n", tmp_sb.s_inodes_count);
printf("blocks count : %zu\n", tmp_sb.s_blocks_count);
printf("free blocks count: %zu\n", tmp_sb.s_free_blocks_count);
printf("free i-nodes count: %zu\n", tmp_sb.s_free_inodes_count);
printf("i-nodes size: %zu\n", tmp_sb.s_inode_size);
printf("blocks size: %zu\n", tmp_sb.s_block_size);
printf("first ino: %zu\n", tmp_sb.s_first_ino);
printf("first blo: %zu\n", tmp_sb.s_first_blo);
printf("bm i-node start: %zu\n", tmp_sb.s_bm_inode_start);
printf("bm block start: %zu\n", tmp_sb.s_bm_block_start);
printf("i-node start: %zu\n", tmp_sb.s_inode_start);
printf("block start: %zu\n", tmp_sb.s_block_start);
printf("***********************************************************************");
} // Finish the method
struct在寫的時候有以下信息
fs: 2
i-nodes count : 64
blocks count : 192
free blocks count: 192
free i-nodes count: 64
i-nodes size: 120
blocks size: 64
first ino: 0
first blo: 0
bm i-node start: 272
bm block start: 336
i-node start: 528
block start: 8208
但是當我閱讀信息時,我得到以下結果,信息已丟失
fs: 3472328296227680304
i-nodes count : 3472328296227680304
blocks count : 3472328296227680304
free blocks count: 3472328296227680304
free i-nodes count: 3472328296227680304
i-nodes size: 120
blocks size: 64
first ino: 0
first blo: 0
bm i-node start: 272
bm block start: 336
i-node start: 528
block start: 8208
前五個字段包含垃圾。 為什么會發生這種情況? 我感謝任何幫助
注意:我已經添加了該方法的所有行。 我正在使用 Ubuntu 發行版。 要打開文件,我使用以下說明
FILE *disco;
disco = fopen(path, "r+b");
if(disco){
if(cmd.fs == '2'){
formatear_ext2(cmd.type, meta->part_start, meta->part_size, disco);
}else if(cmd.fs == '3'){
formatear_ext3(cmd.type, meta->part_start, meta->part_size, disco);
}else{
printf("ERROR\n");
}
}else{
printf("ERROR: No se pudo acceder al dispositivo.\n");
}
添加一些代碼后,我仍然不知道什么是cmd
、 meta
、 I_NODO
、 BLOQUE_ARCHIVO
... 以及它們的值是什么。
我試圖從日志中推測值以便可以編譯和運行,我發現值3472328296227680304
,就像@Scheff 說的,0x3030303030303030 是由下面的代碼編寫的( "0"
值是0x30
)
for(size_t i = 0; i < super_block.s_inodes_count; i++){
fseek(disco, super_block.s_first_ino + i, SEEK_SET);
fwrite("0", 1, 1, disco);
}
for(size_t i = 0; i < super_block.s_blocks_count; i++){
fseek(disco, super_block.s_first_blo + i, SEEK_SET);
fwrite("0", 1, 1, disco);
}
如果我注釋掉代碼部分,則不會出現奇數
由於信息丟失,我無法准確指出錯誤,但我認為這會有所幫助
我建議您添加一些調試代碼,例如打印出super_block.s_first_ino
值,以查找錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.