2017-02-12 6 views
0

Так что мне нужно преобразовать текстовый файл в двоичный файл.Преобразование текстового файла в двоичный файл в c

Текстовый файл в форматированный как-

Имя Фамилия ID GPA (строка строки без знака INT флоат)

Пример текстового файла может быть:

Джон Смит 32 2.5

джо молодой 12 3,4

void textToBinary(char *inp, char *out) 
{ 

FILE *finp; 
FILE *fout; 
unsigned int x; 
float y; 
char first[SIZE], last[SIZE]; 

finp = fopen(inp, "r"); 
fout = fopen(out, "w"); 

rewind(finp); 

    while(1) 
    { 
    fscanf(finp, "%s %s %u %f\n", first, last, &x, &y); 

    fwrite(first, 1, sizeof(char), fout); 
    fwrite(last, 1, sizeof(char), fout); 
    fwrite(&x, 4, sizeof(unsigned int), fout); 
    fwrite(&y, 4, sizeof(int), fout); 

     if(feof(finp)) 
     { 
     break; 
     } 

    } 

fclose(finp); 
fclose(fout); 
} 

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

>diff output.bin b1.bin 
>Binary Files output.bin b1.bin differ 

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

+0

Подсказка: проверьте параметры 'fwrite', т. Е.' Size_t fwrite (const void * buffer, size_t size, size_t count, FILE * stream) ', в частности возможность предоставить размер и счет отдельно. –

+0

Для 'first' и' last', почему вы записаны только 1 char ('fwrite (first, 1, sizeof (char), fout);')? –

+0

В чем проблема? Пожалуйста, прочитайте снова [«Как задать хороший вопрос?»] (Http://stackoverflow.com/help/how-to-ask). –

ответ

0

Предоставленный исходный код показывает недоразумения об использовании функции fwrite() для записи данных в двоичном файле.

Ошибка 1 - для записи строки используйте фиксированную или реальную длину.

Основано на обеих линиях fwrite(first, 1, sizeof(char), fout); и fwrite(last, 1, sizeof(char), fout);.

Использование:

fwrite(first, (strlen(first)+1), sizeof(char), fout); 

Или:

fwrite(first, SIZE, sizeof(char), fout); 

Ошибка 2 - записать только один unsigned int используется 1 элемент.

Основано на строке fwrite(&x, 4, sizeof(unsigned int), fout);.

Использование:

fwrite(&x, 1, sizeof(unsigned int), fout); 

Ошибка 3 - записать один float, использовать правильный sizeof().

Основано на строке fwrite(&y, 4, sizeof(int), fout);.

Использование:

fwrite(&y, 1, sizeof(float), fout); 

Extra:

Во всех случаях при использовании fwrite() не забудьте проверить возвращаемое значение (должно быть равно числу элементов письменного).

+0

Спасибо, я выяснил strlen для char, но изменил количество байтов для float/unsigned int помог –

Смежные вопросы