Я пытаюсь написать программу на C, которая читает двоичный файл и преобразует его в тип данных. Я создаю двоичный файл с головной командой head -c 40000 /dev/urandom > data40.bin
. Программа работает для типов данных int и char, но не работает для двойного. Вот код программы.Чтение из двоичного файла и преобразование в double?
void double_funct(int readFrom, int writeTo){
double buffer[150];
int a = read(readFrom,buffer,sizeof(double));
while(a!=0){
int size = 1;
int c=0;
for(c=0;c<size;c++){
char temp[100];
int x = snprintf(temp,100,"%f ", buffer[c]);
write(writeTo, temp, x);
}
a = read(readFrom,buffer,sizeof(double));
}
}
и это функция, которая работает голец
void char_funct(int readFrom, int writeTo){
char buffer[150];
int a = read(readFrom,buffer,sizeof(char));
while(a!=0){
int size = 1;
int c=0;
for(c=0;c<size;c++){
char temp[100]=" ";
snprintf(temp,100,"%d ", buffer[c]);
write(writeTo, temp, strlen(temp));
}
a = read(readFrom,buffer,sizeof(char));
}
}
Проблема заключается в том, что с полукокса мне нужно, чтобы получить 40000 слов с wc -w file
и я получаю их. Теперь с двойным я получаю случайное количество слов, но теоретически я должен получить 5000 из 40000 байт данных, но я получаю случайное количество между 4000 и 15000, а для char я получаю 40000, как будто он должен 1 байт для одного символа.
Я не знаю, что не так, тот же код работает для int
, где я получаю 10000 слов из 40000 байт данных.
Небезопасно предполагать, что 'read()' считывает полное количество запрошенных байтов. Крайне важно использовать возвращаемое значение, чтобы определить, сколько байтов действительно было прочитано. –
Кроме того, 'read()' вернет '-1', если возникнет ошибка. Вы не учитываете эту возможность, и если произошла ошибка, вы обрабатываете данные who-know-what. –
Эта строка: 'int x = snprintf (temp, 100,"% f ", buffer [c]);' принимает один символ из буфера и пытается преобразовать его в float.Возможно, вы захотите проверить возвращаемое значение 'x', которое сообщит вам, сколько было записано в буфер. Но это, конечно, не то, что вы хотите делать. – bruceg