Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2010, 11:42   #1
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию работа с бинарными файлами

Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию и, применяя режим прямого доступа вывести на печать информацию о самом дешевом издании.
вид структуры: название издания, газеты или журнала, стоимость одного экземпляра, количество экземпляров в год.
Код:
#include <stdio.h>
#include<conio.h>
#include<string.h>
struct library {char name[20]; char newspap[15]; char magazine[15]; float price; int circula;} l1;
void input (FILE*); // создание нового файла
void print (FILE*); // просмотр файла
void app (FILE*); //добавление в файл
void cena (FILE*);// инфо о дешевом издании
main()
{
 char c;
FILE*nf;
while (1)
{clrscr();
puts("1-*Новый файл");
puts("2-Просмотр файла*");
puts("3-Добавление в файл");
puts("4-Дешевое издание");
puts("0-выход");
c=getch();
switch(c)
{case '1':input(nf); break;
case '2':print(nf); break;
case '3': app(nf); break;
case '4': cena(nf); break;
case '0': return 0;
defaults: puts("*неверный режим");
}
}
}
/////////////////////////////
////////////////////////////////////////////////////////
/////////////////////////////////////

void input(FILE*nf)
{ char ch;
nf=fopen("file1.dat","wb");// отк-м файл для записи///// 
clrscr();
printf("\n ‚ввод данных библиотеки\n");
do
{printf("\n **название:\n");
scanf("%s",l1.name);
printf("\n журнал:\n");
scanf("%s",l1.newspap);
printf("\n газета:\n");
scanf( "%s",l1.magazine);
printf("\n цена:\n");
scanf("%f", &l1.price);
printf( " \n кол-во вып в год:\n");
scanf("%d", &l1.circula);
fwrite(&l1, sizeof(l1),1,nf);
printf("\n Закончить? y/n \n");
ch=getch();
}
while(ch !='y');
fclose(nf);
}
////////////////////////////////////////////////////////
////////////////////////////
///////////////////
////////////////
void print (FILE*nf)
{ int i;
clrscr();
nf=fopen("file1.dat","rb");/откр.файл. для чтен
i=1;
fread(&l1,sizeof(l1),1,nf);
while(!feof(nf))
{printf("\n %d %s  %s  %s  %f  %d ",i,l1.name,l1.newspap,l1.magazine,l1.price,l1.circula);
fread(&l1, sizeof(l1),1,nf);
i++;
}
getch();
}
     ///////////////////////////////////////////////////////////
/////////////////////
/////////////
/////
void app(FILE*nf)
{ char ch;
nf=fopen("file1.dat","ab");
clrscr();
printf("ввод данных в библиотеку\n");
do
{printf("\n **название:");
scanf("%s",l1.name);
printf("Ј*газета:");
scanf("%s", l1.newspap);
printf("журнал:");
scanf("%s", l1.magazine);
printf("цена:");
scanf("%f", l1.price);
printf("кол-ва вып.в год:");
scanf("%d", l1.circula);
fwrite(&l1,sizeof(l1),1,nf);
printf("закончить? y/n");
ch=getch();
}
while (ch != 'y');
fclose(nf);
}
void cena(FILE*nf)
{float i,j, min;
nf=fopen("file1.dat","rb");
clrscr();
puts("самое дешевое издание:");
fread(&l1,sizeof(l1),1,nf);
min=pricemin[0];
for(i=1;i<n; i++)
if(min>pricemin)
min=pricemin[i];

getch();
}
1. 2. 3.пункты меню работают, а четвертый по выводу текста на экран о самом дешевом издании нет.

подскажите как подправить 4 пункт меню , не получается у меня без ошибок записать условие
ну и вобщем может кто что подскажет или посоветует?

Последний раз редактировалось klykovka; 23.04.2010 в 18:12.
klykovka вне форума Ответить с цитированием
Старый 23.04.2010, 12:57   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

пропустил %d, & - при выводе не нужен

Код:
printf("\n %d%s  %s  %s  %f  %d ",i,l1.name,l1.newspap,l1.magazine,l1.price,l1.circula);
counter вне форума Ответить с цитированием
Старый 23.04.2010, 13:41   #3
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию

counter спасибо

ну подскажите кто-нить как исправить?

блин, ну хоть кто нить, че нить, чирканите.

Последний раз редактировалось Stilet; 28.04.2010 в 11:24.
klykovka вне форума Ответить с цитированием
Старый 26.04.2010, 17:41   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
вот та часть которая желтым там ошибки.
ну, как минимум, в цикле, где ищется минимальное значение пропущен индекс в условии сравнения:
Код:
for(i=1;i<n; i++)
  if(min>pricemin[i])
    min=pricemin[i];
а как максимум - откуда взялся массив pricemin и кто его заполнял!?
тогда уж так:

Код:
вверху добавьте ещё переменную lMin
struct library {char name[20]; char newspap[15]; char magazine[15]; float price; int circula;} l1, lMin;

..... тут Ваш код....

void cena(FILE*nf)
{ int i;
  clrscr();
  nf=fopen("file1.dat","rb");/откр.файл. для чтен
  if feof(nf)
  {
      puts("Файл Пуст!");
  }
  else
  {
     fread(&l1,sizeof(l1),1,nf);
     lMin = l1;
     while(!feof(nf))
     {
       fread(&l1,sizeof(l1),1,nf);
       if (lMin.price>l1.price)
          lMin = l1;
     }
     puts("самое дешевое издание:");
     printf("\n %s  %s  %s  %f  %d ",lMin.name,lMin.newspap,lMin.magazine,lMin.price,lMin.circula);
  }
  fclose(nf); // и НЕ ЗАБЫВАЕМ Закрывать файл!

  getch();
}
p.s. язык С вообще не знаю, пишу интуитивно, поэтому за ошибки уж не взыщите!

p.p.s. кстати, в процедуре чтения файла Вы его забываете закрывать! Это некрасиво и чревато нехорошими последствиями...

Последний раз редактировалось Serge_Bliznykov; 26.04.2010 в 17:55.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2010, 19:18   #5
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию

int i; а почему объявленная переменная целого типа нигде не используется?

Код:
#include <stdio.h>
#include<conio.h>
#include<string.h>
struct library {char name[20]; char newspap[15]; char magazine[15]; float price; int circula;} l1, lmin;
void input (FILE*); //создание нового файла
void print (FILE*); //просмотр файла
void app (FILE*); // добавление в файл
void cena (FILE*); // самое дешевое издание
main()
{
 char c;
FILE*nf;
while (1)
{clrscr();
puts("1-*новый файл");
puts("2-просмотр файла*");
puts("3-добавление в файл");
puts("4-дешевое издание");
puts("0-выход");
c=getch();
switch(c)
{case '1':input(nf); break;
case '2':print(nf); break;
case '3': app(nf); break;
case '4': cena(nf); break;
case '0': return 0;
defaults: puts("*неверный режим");
}
}
}
/////////////////////////////
////////////////////////////////////////////////////////
/////////////////////////////////////

void input(FILE*nf)
{ char ch;
nf=fopen("file1.dat","wb");//открытие файла для записи
clrscr();
printf("\n ‚ввод данных библиотеки\n");
do
{printf("\n **название :\n");
scanf("%s",l1.name);
printf("\n газета (да или нет):\n");
scanf("%s",l1.newspap);
printf("\n журнал (да или нет):\n");
scanf( "%s",l1.magazine);
printf("\n цена:\n");
scanf("%f", &l1.price);
printf( " \n колличество выпусков в год:\n");
scanf("%d", &l1.circula);
fwrite(&l1, sizeof(l1),1,nf); //запись в файл одной структуры l1//
printf("\n закончить? y/n \n");
ch=getch();
}
while(ch !='y');
fclose(nf);
}
////////////////////////////////////////////////////////
////////////////////////////
///////////////////
////////////////
void print (FILE*nf)
{ int i;
clrscr();
nf=fopen("file1.dat","rb");//открыте файла для чтения//
i=1;
fread(&l1,sizeof(l1),1,nf);//чтение одной струк-ры
while(!feof(nf))
{printf("\n %d %s  %s  %s  %3f  %d ",i,l1.name,l1.newspap,l1.magazine,l1.price,l1.circula);
fread(&l1, sizeof(l1),1,nf);
i++;
}
fclose(nf);
getch();
}
     ///////////////////////////////////////////////////////////
/////////////////////
/////////////
/////
void app(FILE*nf)
{ char ch;
nf=fopen("file1.dat","ab");//открыт.файла для добавления//
clrscr();
printf("ввод данных библиотеки\n");
do
{printf("\n **название:");
scanf("%s",l1.name);
printf("газета(да или нет):");
scanf("%s", l1.newspap);
printf("журнал(да или нет):");
scanf("%s", l1.magazine);
printf("цена:");
scanf("%f", l1.price);
printf("колличество выпусков в год:");
scanf("%d", l1.circula);
fwrite(&l1,sizeof(l1),1,nf);
printf("закончить? y/n");
ch=getch();
}
while (ch != 'y');
fclose(nf);
}
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////
//////////////////////////////////
///////////////////
////////////////
////////////
////////
/////////
//////
///
//

void cena(FILE*nf)
{
clrscr();
nf=fopen("file1.dat","rb");
if feof(nf)
{
puts("файл пуст");
}
else
{
fread(&l1,sizeof(l1),1,nf);
lmin=l1;
while(!feof(nf))
{
fread(&l1,sizeof(l1),1,nf);
if(lmin.price>l1.price)
lmin=l1;
}
puts( "самое дешевое издание:");
printf("\n %s %s %s %3f %d",lmin.name, lmin.newspap, lmin.magazine,lmin.price, lmin.circula);
}
fclose(nf);
getch();
}
я недавно начал изучать си, попробовал исправить ваши замечания. Вот в таком виде все работает, но хотел уточнить кое-какие нюансы?
в моменты заполнения библиотеки иногда , после заполнения первой строки названия, вторая и третья могут вылетать одновременно т.е. мне нужно заполнить поле журнал, а меня уже курсор на газете т.е. перескакивает ввод одного параметра и становится на ввод следующего.
и еще хотел спросить как вставить цикл, для журнала и газеты. У меня сейчас после ввода названия идет строка" журнал (да или нет)" и так же с газетой. т.е. если это журнал то чтобы поле газета уже не появлялось, не знаю как организовать два цикла т.к. один уже есть

Последний раз редактировалось Stilet; 28.04.2010 в 11:25.
klykovka вне форума Ответить с цитированием
Старый 27.04.2010, 12:58   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
int i; а почему объявленная переменная целого типа нигде не используется?
Вы правы, осталась от прошлого. не нужна. можно смело выкинуть!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.04.2010, 18:11   #7
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию

Serge_Bliznykov спасибо!!! А по последнему вопросу что-нибудь посоветуете?
klykovka вне форума Ответить с цитированием
Старый 28.04.2010, 11:07   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

klykovka
по последнему вопросу.
Цитата:
как вставить цикл, для журнала и газеты. У меня сейчас после ввода названия идет строка" журнал (да или нет)" и так же с газетой. т.е. если это журнал то чтобы поле газета уже не появлялось
проблема в том, что Ваш типизированный файл (а ведь по сути, это одна простенькая таблица БД) неверно спроектирован! Не должно быть текстовое поле "Газета )Да/нет" (к слову, туда можно у Вас писать всякую фигню)
а должно быть, например, поле "тип издания" либо числовое (0 - не задано, 1 - газета, 2 - журнал, 3 - книга и т.д...), либо однобуквенная кодировка: "Г" - газета, "Ж" - журнал и т.д.. хоть, "Л" - листовка.... :

но в любом случае, при вводе Вы должны проверять, что введено и не давать вводить недопустимые значения!!!

Кстати,
Цитата:
мне нужно заполнить поле журнал, а меня уже курсор на газете т.е. перескакивает ввод одного параметра и становится на ввод следующего.
думаю, что это происходит из за "залипания" нажатия Enter (т.е. вы нажимаете несколько раз подряд Enter). Бороться с этим несложно - не позволяйте вносить пустые значения (повторяйте в цикле, пока не введут правильное значение).
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывести различия между двумя бинарными файлами Dzmitry Loktseu Общие вопросы Delphi 4 02.02.2010 13:01
Работа с бинарными файлами StudentPolitech Общие вопросы C/C++ 0 19.05.2009 23:48
Работа с бинарными кодами Евгений_Ф Фриланс 2 18.02.2009 03:00