Как читать маленькие целые числа от файла в С++?
Скажем, у меня есть двоичный файл; он содержит положительные двоичные числа, но написанный в little endian как 32-битные целые числа
Как я могу прочитать этот файл? У меня есть это прямо сейчас.
int main() {
FILE * fp;
char buffer[4];
int num = 0;
fp=fopen("file.txt","rb");
while ( fread(&buffer, 1, 4,fp) != 0) {
// I think buffer should be 32 bit integer I read,
// how can I let num equal to 32 bit little endian integer?
}
// Say I just want to get the sum of all these binary little endian integers,
// is there an another way to make read and get sum faster since it all
// binary, shouldnt it be faster if i just add in binary? not sure..
return 0;
}
Ответы
Ответ 1
Это один из способов сделать это, который работает либо в архитектуре большого или маленького конца:
int main() {
unsigned char bytes[4];
int sum = 0;
FILE *fp=fopen("file.txt","rb");
while ( fread(bytes, 4, 1,fp) != 0) {
sum += bytes[0] | (bytes[1]<<8) | (bytes[2]<<16) | (bytes[3]<<24);
}
return 0;
}
Ответ 2
Если вы используете Linux, вы должны посмотреть здесь; -)
Это полезные функции, такие как le32toh
Ответ 3
Из CodeGuru:
inline void endian_swap(unsigned int& x)
{
x = (x>>24) |
((x<<8) & 0x00FF0000) |
((x>>8) & 0x0000FF00) |
(x<<24);
}
Итак, вы можете напрямую прочитать unsigned int
, а затем просто вызвать это.
while ( fread(&num, 1, 4,fp) != 0) {
endian_swap(num);
// conversion done; then use num
}