Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись структуры в файл, в ТС 
:(
    Опции темы
Джем
  Дата 22.11.2004, 14:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Обозначаю некоторую структуру
Код

struct info {
                    char name[20];
     char singer[20];
     char category[10];
     int cost;
   } disk;

Далее ввод информации
Код

puts("Name of disk");
gets(disk.name);
puts ("Singer");
gets(disk.singer);
puts ("Category of disk");
gets(disk.category);
puts ("Cost");
scanf ("%d",&disk.cost);
if ((fwrite(&disk,sizeof(disk),1,f))==0)
  {
    puts("Error of writing information in file");
    getch();
    exit(0);
  }

где f - указатель на файл

При запуске программа выдает

Name of disk
Singer

А потом только лишь ожидает ввода smile А как же gets(disk.name)?
Сам текстовый файлик, куда посылается структура, тож получается корявеньким. Мало того, что нет названия диска, так еще и Cost не заносится верно - вместо числа, которое ввели, стоит буква. smile

В чем я обшибаюсь?
  Вверх
S.A.P.
Дата 22.11.2004, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Джем, юзай потоки
Код

#include <iostream.h>
cout << "Name of disk" << endl;
cin >> disk.name;
...


smile давненько я сюда не заглядывал.
PM MAIL   Вверх
Джем
Дата 23.11.2004, 05:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Perchilla
У меня не С++, а просто С. Не пойдет.
  Вверх
Джем
Дата 23.11.2004, 09:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
При запуске программа выдает

Name of disk
Singer

А потом только лишь ожидает ввода  А как же gets(disk.name)?

Заменил gets на scanf, пошло дело (не понятно).


Цитата
Cost не заносится верно - вместо числа, которое ввели, стоит буква.

Теперь регулярно в файле вместо Cost (например 100) стоит буква 'd'. ???

Еще вылезла ошибка. В файл пишу структуры, используя цикл, до тех пор пока пользователь не нажмет кой-какую клавишу. Так вот, первую структуру записывает в файл без проблем, а на вторую ругается Error of writing information in file, т.е. не пишет. smile ???? Почему такое может быть?
  Вверх
bel_nikita
Дата 23.11.2004, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
вместо числа, которое ввели, стоит буква.
правильно, вы же не в ASCII число пишете. да еще небось в hex-формате файл просматриваете.
Еще не понятно, как вы открываете файл. И закрываете ли его?
Вот, примерный код, который должен работать:
Код

struct info {
 char name[20];
 char singer[20];
 char category[10];
 //int cost;
 char cost[10];
} disk;

...
 FILE* f;

 f = fopen("ALATRA.TXT","a+");

 if ( !f ) exit(0);

 puts("Name of disk");
 gets(disk.name);
 puts ("Singer");
 gets(disk.singer);
 puts ("Category of disk");
 gets(disk.category);
 puts ("Cost");
 //scanf ("%d",&disk.cost);
 gets(disk.cost);
 if ( (fwrite(&disk,sizeof(disk),1,f)) ==0 )
 {
   puts("Error of writing information in file");
   getch();
   exit(0);
 }
 fclose(f);
...


Да, еще. Вместо gets, лучше использовать fgets. Там защита от переполнения есть.

З.Ы.: и про вырвнивание в структурах не забывать! желательно структуры выравнить по 8 байтной границе

Это сообщение отредактировал(а) bel_nikita - 23.11.2004, 10:33


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Silver
Дата 23.11.2004, 10:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Для структур лучше использвать fread,fwrite
  Вверх
azesmcar
Дата 23.11.2004, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



В начале программы не помешает #pragma pack(1)
На самом деле для быстрого наождения файлов в С любая переменная меньше 4 байт занимает 4 байта, если создать структуру
Код

struct A
{
  char p;
  int t;
}


то программа займет 4 байта для р и 4 для t, если нужен какой нибудь конкретный формат надо писать вышеуказанную директиву...
Цитата
Джем, юзай потоки

Потоки здесь не пойдут, попробуй cin << c прочитать текст с пробелами, пробел здесь принимается в качестве разделителя и все что после него отбрасывается...


PM   Вверх
Джем
Дата 23.11.2004, 12:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











bel_nikita
Цитата(bel_nikita @ 23.11.2004, 10:31)
правильно, вы же не в ASCII число пишете

интересно...почему-то тогда числовая переменная (сама по себе без структуры) с помощью fprintf записывается в файл нормально?


Цитата(bel_nikita @ 23.11.2004, 10:31)
Еще не понятно, как вы открываете файл. И закрываете ли его?

Открываю файл (до тех пор пока не введено правильно имя) так
Код

[code=cpp]
if ((f=fopen(fname,"a"))==NULL)
 printf("\nYou've put uncorrect file name - %s",fname);

[/code]
Потом ввод информации, запись в файл, закрытие файла. Если нужно занести еще информацию, все начинается по-новому.


Цитата(bel_nikita @ 23.11.2004, 10:31)
З.Ы.: и про вырвнивание в структурах не забывать! желательно структуры выравнить по 8 байтной границе

Извиняюсь за тупость smile , а это как?

  Вверх
bel_nikita
Дата 23.11.2004, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Открываю файл (до тех пор пока не введено правильно имя) так
Код

if ((f=fopen(fname,"a"))==NULL)
printf("\nYou've put uncorrect file name - %s",fname);

не понял этих строчек smile

Надо, типа этого:
Код

char fname[20];
puts("Name of disk");
gets(fname);
if ( memcmp(fname,"MyName.txt",strlen("MyName.txt")) )
{
   printf("\nYou've put uncorrect file name - %s",fname);
   exit(0);
}
if ( (f=fopen(fname,"a")) == NULL )
{
   printf("\nCan't open file - %s",fname);
   exit(0);
}

Цитата
а это как?
вот так smile
azesmcar
Цитата
не помешает #pragma pack(1)

Добавлено @ 13:00
кое-что про выравнивание в структурах


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Джем
Дата 23.11.2004, 13:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(bel_nikita @ 23.11.2004, 12:57)
Открываю файл (до тех пор пока не введено правильно имя) так

Код

if ((f=fopen(fname,"a"))==NULL)
printf("\nYou've put uncorrect file name - %s",fname);


не понял этих строчек


fname - имя файла, который либо открывается для дозаписи (либо создается, если ранее отстутсвовал).


Цитата(bel_nikita @ 23.11.2004, 12:57)
char fname[20];
puts("Name of disk");
gets(fname);
if ( memcmp(fname,"MyName.txt",strlen("MyName.txt")) )
{
  printf("\nYou've put uncorrect file name - %s",fname);
  exit(0);
}

а я не понял этих строчек, зачем мне memcmp?

Дык у меня траблы с записыванием второй структуры именно из-за выравнивания?
  Вверх
Джем
Дата 23.11.2004, 14:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Почему первая структура записывается в файл, а вторая нет? smile
  Вверх
Джем
Дата 23.11.2004, 14:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А еще волнует эстетический вопрос: как сделать чтоб данные структур дисков в файле отображались колонками ровненько? Да так, чтоб потом читать их можно было fread-ом. smile
  Вверх
bel_nikita
Дата 23.11.2004, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Вот, пишет до посинения в файл smile
Код
 FILE* f;

m1:
  f = fopen("ALATRA.TXT","a+");

  if ( !f ) exit(0);

  puts("Name of disk");
  gets(disk.name);
  puts ("Singer");
  gets(disk.singer);
  puts ("Category of disk");
  gets(disk.category);
  puts ("Cost");
  //scanf ("%d",&disk.cost);
  gets(disk.cost);
  if ( (fwrite(&disk,sizeof(disk),1,f)) ==0 )
  {
    puts("Error of writing information in file");
    //getch();
    exit(0);
  }
  fclose(f);
  goto m1;

Ошибка у тебя в том, что дожен закрыть файл, а потом снова его открыть. Либо не закрывать, но тогда и неоткрывать по 10 раз.

Цитата
чтоб потом читать их можно было fread-ом
можешь читать, также, т.е. сразу структуру считываешь и все будет ок.



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Джем
Дата 24.11.2004, 06:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











bel_nikita
Спасибо большое тебе за поддержку в трудную минуту smile . Но... smile , как оказалось, это моя намУдренность. Ошибка моя в том, что файл то я закрываю, а вот открыть его повторно забыл smile . Да уж...

А насчет моего вопроса об эстетике не понял. Как сделать? smile
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0953 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.