Чтение значений из двоичного файла в C - PullRequest
0 голосов
/ 25 января 2019

это моя проблема: я не знаю, как читать целые числа из двоичного файла. Мне нужно решение для понимания проблемы, стоящей за кодом.

Это изображение моего двоичного файла: enter image description here

Это формат для запоминания 32-битных целых чисел с прямым порядком байтов. Например, у нас есть файл с 3 значениями: 1, 2 и 3, в этом формате они будут кодифицированы в: 01 00 00 00 02 00 00 00 03 00 00 00 или 01 FF FF FF ....

Я написал некоторую строку кода, и я не понимаю, почему это не работает. Отладка не дает мне ошибок.

Это мой код

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

int *leggiinteri2(const char *filename, size_t *size)  
{
FILE *f;
int *p = NULL;
f = fopen(filename, "rb");
if (f == NULL) {
    p = NULL;
}
else {
    size_t nInteri = fread(size, sizeof(int), 1, f);
    if (nInteri != 1) {
        if (feof(f)) {
            p = NULL;
        }
        if (ferror(f)) {
            p = NULL;
        }
    }
    else {
        p = malloc(sizeof(int)*((int)size));
        fseek(f, 0, SEEK_SET);
        nInteri = fread(p, sizeof(int), *size, f);
        if (nInteri != *size) {
            if (feof(f)) {
                p = NULL;
            }
            if (ferror(f)) {
                p = NULL;
            }
        }
    }
}
fclose(f);
return p;
}

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я наконец нашел решение, это заняло много времени, но оно того стоило, теперь я понимаю логику, стоящую за ним.

Это код для тех, кому это нужно:

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

int *leggiinteri2(const char *filename, size_t *size) 
{
    FILE *f;
    int *p = NULL;
    f = fopen(filename, "rb");
    if (f == NULL) {
        p = NULL;
    }
    else {
        fseek(f, 0, SEEK_END); //It tells me how many values ​​there are in 
                              //the file, both those that I need and those 
                              //that do not 
        long dim = ftell(f); // I assign to dim the value that tells me 
                            //ftell, conditioned by the previous function
        dim = dim / 4; //because I want the integer values (int = 4 bytes)
        *size = dim;
        p = malloc(sizeof(int) * dim);
        fseek(f, 0, 0);
        size_t n = fread(p, sizeof(int), *size, f);
        if (n != *size) {
            if (feof(f)) {
                p = NULL;
            }
            if (ferror(f)) {
                p = NULL;
            }
        }
        if (n == 0) //serves to check for empty or NULL files
            p = NULL;
    }
    fclose(f);
    return p;
}
0 голосов
/ 25 января 2019

Попробуйте что-то вроде:

    fread (buffer, sizeof(char), 8, fid);
    x = (s32)(((buffer[0]<<24) & 0xFF000000) + ((buffer[1]<<16) & 0x00FF0000)
            + ((buffer[2]<< 8) & 0x0000FF00) + ( buffer[3]      & 0x000000FF));

Я не уверен в порядке (младший или старший порядковый номер).Если KO, поменяйте местами индексы буфера 3, 2, 1, 0.

...