2015-06-12 3 views
1

В настоящее время я работаю над созданием двоичного файла. Вот что я пробовал.создать двоичный файл в C

Пример 1:

#include<stdio.h> 

int main() { 
    /* Create the file */ 
    int a = 5; 
    FILE *fp = fopen ("file.bin", "wb"); 
    if (fp == NULL) 
     return -1; 
    fwrite (&a, sizeof (a), 1, fp); 
    fclose (fp); 
    } 

    return 0; 
} 

Пример 2:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    FILE *fp; 
    char str[256] = {'\0'}; 
    strcpy(str, "3aae71a74243fb7a2bb9b594c9ea3ab4"); 
    fp = fopen("file.bin", "wb"); 
    if(fp == NULL) 
     return -1; 
    fwrite(str, sizeof str, 1, fp); 
    return 0; 
} 

Пример 1 дает правильный вывод в двоичной форме. Но пример 2, где я передаю строку, не дает мне правильного вывода. Он записывает входную строку, которую я дал в файл, и добавляет некоторые данные (двоичная форма).

Я не понимаю, и я не могу понять, какую ошибку я делаю.

+0

Вместо «sizeof str» в вызове fwrite() вы должны использовать strlen (str). Кроме того, как выглядит содержимое файла, например, из «hexdump file.bin»? – donjuedo

+0

Пример 2 - это правильная вещь. Вы выписали значения ASCII, которые представляют собой двоичные представления символов. Поэтому, конечно, вы увидите строку, если вы проверите файл. После этого вы также получите доступ к тому, что gobblety gook находится за пределами тех символов в памяти, поскольку вы написали 256 байтов, но ваша строка короче. – lurker

+0

Не забудьте закрыть файл 'fclose (fp);'. – user3337714

ответ

2

Проблема в том, что sizeof str - это 256, то есть весь размер локально объявленного массива символов. Однако данные, которые вы храните в нем, не требуют всех 256 символов. В результате операция записи записывает все символы строки плюс любой мусор, который уже был в массиве символов. Попробуйте следующую строку в качестве исправления:

fwrite(str, strlen(str), 1, fp); 
0

строки C являются нулем, а это означает, что все после '\0' характера должны быть проигнорированы. Если вы прочитали файл, написанный в примере 2, в str[256] и распечатали его с помощью printf("%s", str), вы получите исходную строку обратно без дополнительных символов, поскольку нулевой ограничитель также будет считываться в буфер, обеспечивая надлежащее завершение для строки.

Причина, по которой вы получаете дополнительный «мусор» на выходе, состоит в том, что fwrite не интерпретирует str[] массив как строку C. Он интерпретирует его как буфер размером 256. Текстовые редакторы не интерпретируют нулевой символ как терминатор, поэтому случайные символы от str записываются в файл.

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

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