2016-09-20 4 views
1

Я пытаюсь проверить запись в двоичный файл в c и просто хочу понять мой вывод.Запись в двоичный файл в C, интерпретация вывода

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

void writeToFile(); 

int main(void) { 

    writeToFile(); 

    return(0); 
} 

void writeToFile() { 
    FILE * file = fopen("file.bin","w"); 
    char * string; 

    if(file == NULL) 
     printf("Problem with file\n"); 

    string = malloc(sizeof(char)*6); 

    strcpy(string,"Hello"); 

    fwrite(&string,sizeof(string),strlen(string)+1,file); 

    fclose(file); 

} 

Я интерпретируя свои результаты с помощью команды:

od -c file.bin 

который отображает восьмеричный выход. И дает мне это:

0000000 @ 022 # 001 \0 \0 \0 \0 020 020 # 001 \0 \0 \0 \0                       
0000020 300 016 374 ? 377 177 \0 \0 264 006 @ \0 \0 \0 \0 \0                       
0000040 @ \a @ \0 \0 \0 \0 \0 200 365 c 274 020 177 \0 \0                       
0000060 

Я не уверен, как интерпретировать этот вывод, я знаю, что это в восьмеричной, но как я знаю, что моя строка «Hello» была написана правильно?

Я думал, что смогу преобразовать вывод в ascii, используя таблицу ascii, но я не уверен, что это выполнимо здесь? Есть ли простой способ проверить, правильно ли написана строка «Hello»?

Возможно, я мог бы прочитать выход обратно и как-то проверить, существует ли в нем строка «Hello»?

Любая помощь будет высоко оценена.

+0

Вы передаете адрес 'string' для fwrite. Вы должны передать его значение. – Mick

+0

Может быть проще отобразить вывод в шестнадцатеричном формате (я использую 'od -Ax -t x1' –

+0

Вы пишете * указатель *' string' (не то, на что он указывает, что является строкой), и пучок из мусора, который после него. – immibis

ответ

3

Линия

fwrite(&string,sizeof(string),strlen(string)+1,file); 

должен быть

fwrite(string, strlen(string)+1, 1, file); 

Поскольку

  1. У вас уже есть указатель на элемент - не нужен указатель на этот указатель - следовательно string и не &string
  2. Размер изделия strlen(string) +
  3. У вас есть один пункт

Вот почему вы получаете вывод, что не имеет смысла, так как это случайные вещи в памяти.

EDIT

также

if(file == NULL) 
    printf("Problem with file\n"); 

должен быть

if(file == NULL) { 
    printf("Problem with file\n"); 
    return; 
} 

как есть мало, что может быть сделано с нулевым file в остальной части функции

+1

Ну ладно, и если бы у меня была структура, у которой есть char *, я бы написал ее таким же образом? Также, что представляет собой первый столбец чисел? – eefefefe

+0

Если у вас есть 'struct' вам нужно будет сериализовать его каким-то образом (сериализация Google). Почему бы не прочитать страницу руководства для' fwrite', чтобы узнать о цифрах –

+0

Упоминать ссылку на страницу о сериализации для структур в отношении C? Googling it я, кажется, дает минимальные результаты. – eefefefe

1

Запись в файл в бинарный, вы должны использовать опцию «wb» для записи байта.

FILE * file = fopen("file.bin","wb"); 

Что касается знать, если файл написан правильно, пуленепробиваемый способ (Allthough, вероятно, это выходит лучше один) просто прочитать файл обратно с «гб» и распечатать его в обычном формате.