Чтение чисел из файла в C - PullRequest
2 голосов
/ 13 октября 2011

Я в первую очередь программист на Python, но я работал с C , потому что Python слишком медленный для графики (движущиеся фракталы со скоростью 20 кадров в секунду FTW). Я попал в точку преткновения, хотя ... Я написал небольшой файл в шестнадцатеричном редакторе для тестирования. Когда я пытаюсь прочитать первый байт, 5А, он правильно дает мне 90 с такой программой ...

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *data;
int main(int argc, char* argv[])
{
    data=fopen("C:\\vb\\svotest1.vipc","r+b");
    unsigned char number;
    fread(&number,1,1,data);
    printf("%d\n",number);
}

Но когда я пытаюсь прочитать первые четыре байта, 5A F3 5B 20, в целое число, я получаю 542896986

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *data;
int main(int argc, char* argv[])
{
    data=fopen("C:\\vb\\svotest1.vipc","r+b");
    unsigned long number;
    fread(&number,1,4,data);
    printf("%d\n",number);
}

Это должно быть 1525898016 !!! Проблема в том, что он поменял порядок байтов. GAH! Конечно! То, как эта программа работает, будет зависеть от машины. И теперь, когда мы находимся на этой теме, даже байт не будет работать на каждой машине!

Так что мне нужна помощь ... В Python я могу использовать struct.pack и struct.unpack для упаковки данных в байты, используя любой формат (длинный, короткий, одинарный, двойной, со знаком, без знака, с прямым порядком байтов, с прямым порядком байтов) распакуйте его. Мне нужно что-то подобное в C ... Я мог бы написать это сам, но не знаю как.

Ответы [ 3 ]

1 голос
/ 13 октября 2011

Самый простой способ справиться с этим - это, вероятно, использовать htonl для данных перед тем, как записать их в файл (таким образом, файл будет в сетевом / порядке с прямым порядком байтов) и ntohl при чтении (преобразование данные сетевого заказа в соответствии с местным соглашением, что бы это ни было).

Если вам нужно сделать намного больше, чем несколько значений одного типа, вам может потребоваться поискать более полную библиотеку для этой цели, такую ​​как Sun XDR или Google Буферы протокола .

1 голос
/ 13 октября 2011

Я думаю, что вы можете выяснить (Endianness) http://en.wikipedia.org/wiki/Endianness и затем прочитать порядок байтов.

0 голосов
/ 13 октября 2011

Как это?

unsigned long bin = 0;
unsigned char temp = 0;

for(unsigned char i = 0; i < 4; i++) {
    fread(&temp,1,1,data);
    bin = (bin << 8) | temp;
}

В результате первая часть является наиболее значимой. Я думаю, это то, что вы хотите.

...