Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

файл из структуры

52K
29 мая 2010 года
sopik
23 / / 26.04.2010
меню: Создание файла, Просмотр файла, Поиск, Выход. В файле содержатся структуры со сведениями об абитуриентах: № абитуриента, ФИО, адрес, название предмета, оценка. Вывести информацию об абитуриентах, получивших по заданному предмету положительные оценки.
Код:
#include <stdio.h>
#include<conio.h>
#include<string.h>
 
struct abityrent{int nomer;char fio[50];char adres[50];char predmet[20]; int ocenka[1];} a1,styd ;
void cozdat (FILE*);
void prosmotr (FILE*);
void poisk (FILE*);
void exit (FILE*);
main()
{
char c;
FILE*nf;
while (1)
{clrscr();
puts("++++ меню ++++");
puts("1-создание");
puts("2-просмотра");
puts("3-поиск");
puts("0-выход");
c=getch();
switch(c)
{case '1':cozdat(nf); break;
case '2' :prosmotr(nf); break;
case '3' :poisk(nf); break;
case '0' :return 0;
defaults: puts("*неверный ввод ");
}
}
}
///////////////////////////////////////////////////////////////
void  cozdat(FILE*nf)
{char ch;
nf=fopen("file.dat","wb");
clrscr();
printf("\n ввод абитуриентов\n");
do
{printf("\n-введите номер*:\n");
scanf("%d",a1.nomer);
printf("\n введите фио:\n");
scanf("%s",a1.fio);
printf ("\n-адрес*:\n");
scanf("%s",a1.adres);
printf ("\n предмет  :\n");
scanf("%s", a1.predmet);
printf("\n оценка: \n");
scanf("%d",a1.ocenka);
fwrite(&a1, sizeof(a1),1,nf);
printf("\n закончить? д/н* \n");
ch=getch();
}
while(ch !='¤');
fclose(nf);
}
/////////////////////////////////////////////////////////////////////////
void prosmotr (FILE*nf)
{ int i;
clrscr();
nf=fopen("file1.dat","rb");
i=1;
fread(&a1, sizeof(a1),1,nf);
while(!feof(nf))
{printf("\n %d %s %s %s %d",i,a1.nomer,a1.fio,a1.adres,a1.predmet,a1.ocenka);
fread(&a1, sizeof(a1),1,nf);
i++;
}
fclose(nf);
getch();
}
////////////////////////////////////////////////////////////////////////////
void poisk(FILE*nf)
{int i;
clrscr();
a1=styd;
nf=fopen("file1.dat","rb");
printf("\n поиск хорошистов \n");
printf("\n введите предмет");
scanf("%s",a1.predmet);
for(i=0,i++;)
не могу организовать вывод абитуриентов с положительными оценками, подскажите
392
30 мая 2010 года
cronya
421 / / 03.01.2009
чего непонятного, создавай массив типа структуры закидывай туда информацию, ходи по массиву и ищи хорошистов:)
Цитата:
В файле содержатся [COLOR="Red"]структуры[/COLOR][COLOR="Green"](или все таки данные?)[/COLOR] со сведениями об абитуриентах: № абитуриента, ФИО, адрес, название предмета, оценка. Вывести информацию об абитуриентах, получивших по заданному предмету положительные оценки.

392
30 мая 2010 года
cronya
421 / / 03.01.2009
Цитата: sopik

///////////////////////////////////////////////////////////////
void cozdat(FILE*nf)
{char ch;
nf=fopen("file.dat","wb");
clrscr();
printf("\n ввод абитуриентов\n");
do
{printf("\n-введите номер*:\n");
scanf("%d",[COLOR="Red"]&[/COLOR]a1.nomer);[COLOR="DarkGreen"]//тут ошибка[/COLOR]
printf("\n введите фио:\n");
scanf("%s",a1.fio);
printf ("\n-адрес*:\n");
scanf("%s",a1.adres);
printf ("\n предмет :\n");
scanf("%s", a1.predmet);
printf("\n оценка: \n");
scanf("%d",[COLOR="Red"]&[/COLOR]a1.ocenka);[COLOR="DarkGreen"]//тут ошибка[/COLOR]
fwrite(&a1, sizeof(a1),1,nf);
printf("\n закончить? д/н* \n");
ch=getch();
}
while(ch !='¤');
fclose(nf);
}
/////////////////////////////////////////////////////////////////////////


Попробуй так:)

52K
30 мая 2010 года
sopik
23 / / 26.04.2010
стркутуры, и насчет массива можно поконкретнее.........?
392
30 мая 2010 года
cronya
421 / / 03.01.2009
Ты пробовал брать записи, занесенные в файл, и занести их потом в память(добавить их в массив), сначала посчитай сколько записей в файле, занеси в переменную и общайся с ними как с обыкновенный 1 мерным массивом (ну например) :
Код:
struct my
{
  int num;
};
int main()
{
my *mas;
/*находи число записей в файле*/
int idx=0;
mas=new my[число записей в файле];// выделяй память
fscanf(указатель на файл,"%d",mas[idx].num);
while(!feof(указатель на файл) && idx<число записей в файле)
{
idx++;
mas=new my[число записей в файле];
fscanf(указатель на файл,"%d",mas[idx].num);
}

return 0;
}
/*ищим че там надо*/
for(idx=0;idx<число записей в файле;idx++)
if(mas[idx].num==0)cout<<mas[idx].num;

Конечно лучше использовать списки, с ними быстрее, но сложнее.
ЗЫ Ты загляни чего там в файл занеслось :)
52K
30 мая 2010 года
sopik
23 / / 26.04.2010
так я вообще запутаюсь, для меня сложновато как то...
спасибо за совет
52K
31 мая 2010 года
sopik
23 / / 26.04.2010
Код:
#include <stdio.h>
#include<conio.h>
#include<string.h>
struct abityrent{int nomer;char fio[50];char adres[50];char predmet[20]; int ocenka;} a1,styd ;
void cozdat (FILE*);
void prosmotr (FILE*);
void poisk (FILE*);
void exit (FILE*);
main()
{
char c;
FILE*nf;
while (1)
{clrscr();
puts("++++ меню ++++");
puts("1-создать");
puts("2-посмотреть");
puts("3-поиск");
puts("0-выход");
c=getch();
switch(c)
{case '1':cozdat(nf); break;
case '2' :prosmotr(nf); break;
case '3' :poisk(nf); break;
case '0' :return 0;
defaults: puts("*неверный ввод");
}
}
}
///////////////////////////////////////////////////////////////
void  cozdat(FILE*nf)
{char ch;
nf=fopen("file1.dat","wb");
clrscr();
printf("\n ввод абитуриентов\n");
do
{printf("\n номер*:\n");
scanf("%d",&a1.nomer);
printf("\n фио:\n");
scanf("%s",a1.fio);
printf ("\n-адрес*:\n");
scanf("%s",a1.adres);
printf ("\n предмет :\n");
scanf("%s", a1.predmet);
printf("\n оценка: \n");
scanf("%d",&a1.ocenka);
fwrite(&a1, sizeof(a1),1,nf);
printf("\n закончить? д/н* \n");
ch=getch();
}
while(ch !='д');
fclose(nf);
}
/////////////////////////////////////////////////////////////////////////
void prosmotr (FILE*nf)
{
clrscr();
nf=fopen("file1.dat","rb");
{fread(&a1, sizeof(a1),1,nf);
while(!feof(nf))
{printf("\n %d %s %s %s %d",a1.nomer,a1.fio,a1.adres,a1.predmet,a1.ocenka);
fread(&a1, sizeof(a1),1,nf);
 
}
fclose(nf);
getch();
}
 
}
///////////////////////////////////////////////////////////////////////////
void poisk(FILE*nf)
{
clrscr();
nf=fopen("file1.dat","rb");
if feof(nf)
{
puts("*нет данных");
}
else
{
fread(&a1,sizeof(a1),1,nf);
styd=a1;
while(!feof(nf))
{
fread(&a1,sizeof(a1),1,nf);
 
if(styd.ocenka<3)
styd=a1;
}
puts("студенты с положительными оценками л:");
printf("\n %d %s %s %s %d",styd.nomer, styd.fio, styd.adres,styd.predmet, styd.ocenka);
}
fclose(nf);
getch();



В этом виде все работает, в пункте poisk выполняется абитуриента с оценкой больше или равной 3
мне нужно реализовать поиск всех абитуриентов с оценками выше 3 по заданному предмету. Подскажите как подправить?
}
392
31 мая 2010 года
cronya
421 / / 03.01.2009
Ты перемудрил немного и конкретно запутался:) Если ты работаешь непосредственно с файлом, то дожно быть так, используя простую буферную переменную типа структуры:
 
Код:
fread(&a1,sizeof(a1),1,nf);
    while(!feof(nf))
    {
        if(nf.ocenka>3)cout<<nf.nomer<<" "<<nf.fio<<" "<<nf.adres<<" "<<nf.predmet<<" "<<nf.ocenka<<endl;
        fread(&a1,sizeof(a1),1,nf);
    }

У меня так проще получилось:
Код:
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
struct stud
{
    char fio[30],adres[30],pred[30];
    int nomer,mark;
};
int main(int argc, char *argv[])
{
    FILE *in;
    stud buf1;
    in=fopen("file.dat","wb");
    cout<<"Student Input:"<<endl;
    char symbol1;
    do
    {
        cout<<"Input number: ";
        cin>>buf1.nomer;
        cout<<"Input FIO: ";
        cin>>buf1.fio;
        cout<<"Input Adres: ";
        cin>>buf1.adres;
        cout<<"Input class: ";
        cin>>buf1.pred;
        cout<<"Input mark: ";
        cin>>buf1.mark;
        fwrite(&buf1,sizeof(buf1),1,in);
        cout<<"Input another data?(y/n):  ";
        cin>>symbol1;
    }
    while(symbol1=='y');
    fclose(in);
    in=fopen("file.dat","rb");
    cout<<"DATA:"<<endl;
    fread(&buf1,sizeof(buf1),1,in);
    while(!feof(in))
        {
        cout<<buf1.nomer<<" "<<buf1.fio<<" "<<buf1.adres<<" "<<buf1.pred<<" "<<buf1.mark<<endl;
        fread(&buf1,sizeof(buf1),1,in);
         }
         rewind(in);
         cout<<"Poisk 4 and 5:"<<endl;
         fread(&buf1,sizeof(buf1),1,in);
         while(!feof(in))
         {
        if(buf1.mark>3)cout<<buf1.nomer<<" "<<buf1.fio<<" "<<buf1.adres<<" "<<buf1.pred<<" "<<buf1.mark<<endl;
        fread(&buf1,sizeof(buf1),1,in);
         }
     return 0;
}

Лог программы:
Код:
Student Input:
Input number: 1
Input FIO: lev
Input Adres: moscow
Input class: history
Input mark: 4
Input another data?(y/n):  y
Input number: 2
Input FIO: lopata
Input Adres: lipeck
Input class: russian
Input mark: 3
Input another data?(y/n):  y
Input number: 3
Input FIO: gogol
Input Adres: kiev
Input class: english
Input mark: 5
Input another data?(y/n):  n
DATA:
1 lev moscow history 4
2 lopata lipeck russian 3
3 gogol kiev english 5
Poisk 4 and 5:
1 lev moscow history 4
3 gogol kiev english 5
52K
08 июня 2010 года
sopik
23 / / 26.04.2010
спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог