Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > проблема с fwrite


Автор: marina12 21.5.2013, 23:19
Здравствуйте!
Столкнулась с такой проблемой,что когда записываю в файл структуры с помощью fwrite, в файл печатаются иероглифы(скорее всего,адрес первого символа строки,который хранится в ячейке структуры...). Как этого можно избежать?Если можно,то объясните пожалуйста на моём примере,который приведен ниже (сохранение записной книжки в файл):
Код

struct Telo 
{
    char name[50];
    char lastname [60];
    char phone[35]; 
    char birthday [15];
    char adress [150];
    char comments [100];
};
struct Value
{
    Telo telo;
    Value *next;
};

Value *first = NULL; // Указатель на первый элемент списка

void Save()
{
    system("cls");
    char fileName[80]; // Имя файла                                                 
    printf("Enter the name of file for save: ");
    scanf("%s", fileName);
    cin.ignore(60, '\n');
    FILE *f;
    f= fopen(fileName, "wb"); 
    if (!f) 
    {
        printf("Error of opening file for save\n");
        return;
    }
    Value *v; // Указатель на текущий элемент списка
    v = first;
    while (v != NULL) {
        fwrite(v, sizeof(Value),1,f); // Записываем в файл одну структуру 
        v = v->next;
    }
    fclose(f); // Закрываем файл
    printf("notebook save into file\n");
    getch();
    system("cls");
    Menu();
}

Автор: KaZepKa 21.5.2013, 23:48
Интересно вы как-то записываете в файл, вам для этого нужно определить конкретно, что в файл записывать :  
Код

    char name[50];
    char lastname [60];
    char phone[35]; 
    char birthday [15];
    char adress [150];
    char comments [100];

А так он и записывает:
Код

   Value *v; // Указатель на текущий элемент списка

т.е. его адрес

Автор: feodorv 22.5.2013, 00:28
Цитата(marina12 @  22.5.2013,  00:19 Найти цитируемый пост)
в файл печатаются иероглифы

У Вас структура struct Telo не маленькая. Скорее всего непосредственно данными занята небольшая часть структуры, всё стальное - мусор, оставшийся при malloc или new (чем, кстати, Вы пользуетесь?) Чтобы этого не было, сразу после аллокации структуры делайте
Код

memset( v, 0, sizeof(Value));

а потом уже заполняйте структуру значениями.


И да, записывая в файл именно структуру struct Value, Вы записываете и её элемент Value *next; который также добавит иероглифов. Не знаю, что Вам в файле нужно, но если простой список структур struct Telo, то и записывать нужно только Telo:
Код

       fwrite( &v->telo, sizeof(struct Telo), 1, f); // Записываем в файл одну структуру 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)