nvova, 13.12.2006 - 19:10
Задали написать 2 программы на С++
Если кому не сложно, помогите, пожалуйста, разобраться
1-я Ковертирует из текстового файла (vuz.txt у меня) в бинарный (vuz.dat).
2-я Выводит на экран студентов заданного курса и факультета(использует полученный бин. файл из 1-й программы). Но только по блокам, т.е. вывела 5 студентов, спросила выводить ли дальше и тд.
1.
Конвертор я написал, проверил.
Всё хорошо работает:CODE
#include "stdafx.h"
#include "stdio.h"
#include "iostream"
#include "fstream"
#include "string"
using namespace std;
struct s
{
char fam[15];
char name[15];
char otch[15];
int fk;
int gr;
float sb;
int god;
int tel;
char rab[30];
int kurs;
};
FILE *v;
FILE* i;
s Tmp;
void main()
{
if( (v = fopen( "vuz.txt", "r" )) == NULL ) // C4996
{
printf( "The file 'vuz.txt' was not opened\n" );
fclose(v);
}
else {
v=fopen("vuz.txt","r");
//i=creat("vuz.dat",_S_IREAD | _S_IWRITE );
i=fopen ("vuz.dat","w");
int n=sizeof(s);
while (fscanf(v,"%s%s%s%d%d%f%d%d%s%d", &Tmp.fam,&Tmp.name,&Tmp.otch,&Tmp.fk,&Tmp.gr,&Tmp.sb,&Tmp.god,&Tmp.tel,&Tmp.rab,&Tmp.kurs)!=EOF)
{
printf("%s%s%s%d%d%f%d%d%s%d\n", Tmp.fam,Tmp.name,Tmp.otch,Tmp.fk,Tmp.gr,Tmp.sb,Tmp.god,Tmp.tel,Tmp.rab,Tmp.kurs);
fwrite(&Tmp,sizeof(s),1,i);
};
};
fclose(v);
fclose(i);
}
Вот
пример текстового файла:
CODE
Фамилия Имя Отчество факультет группа средний_балл год рожд телефон место_работы курс
Arapov Alex Iriy 1 5322 4.4 1988 4215362 NET 2
Ivanov Alex Iriy 1 5322 4.6 1988 4215362 NET 2
Kirov Alex Iriy 1 5322 4.6 1988 4215362 NET 2
Mirov Alex Iriy 1 5322 4.6 1988 4215362 NET 2
Torinov Alex Iriy 1 5322 4.6 1988 4215362 NET 2
Sobolev Alex Iriy 1 5322 4.6 1988 4215362 NET 2
Toporov Alex Iriy 1 5322 4.6 1988 4215362 NET 2
Gromov Alex Iriy 1 1322 4.6 1985 4215362 OAO Lenenergo 6
Ivanov Alex Iriy 1 1322 4.7 1985 4215362 RF 6
Luchev Alex Iriy 1 1322 4.9 1985 4215362 FSB_RF 6
Ну а теперь главное
сама прога которая выводит:
QUOTE
struct s
{
char fam[15];
char name[15];
char otch[15];
int fk;
int gr;
float sb;
int god;
int tel;
char rab[30];
int kurs;
};
void kur();
void ball();
void main ()
{
int m=0;
char l;
while(m!=1)
{
cout<<"any key - exit \n 2 - students is kursa\n 3 - vepuskniki po ballu\n";
cin>>l;
switch (l)
{case '2': kur();break;
default : m=1;break;
};
};
};
void kur()
{
int f;
cout<<"Vvedite nomer fakulteta\n";
cin>>f;
int k;
cout<<"Vvedite nomer kursa\n";
cin>>k;
FILE* v;
int b=0;
s Tmp;
int g=sizeof(s);
if ((v=fopen("vuz.dat","r"))==NULL)
cout<<"File is not opened\n";
else
{
while ((!(feof(v)))||(b==0))
{
for (int i=0;i<5;)
{
fread(&Tmp,g,1,v);
if ((Tmp.fk==f)&&(Tmp.kurs==k))
{
cout< i++;
}
else
cout<<"Net";
}
cout<<"vevodit dalshe? 0-Da, 1-Net";
cin>>b;
}
}
}
Теперь вопрос: Вчём я ошибся или как мне оптимизировать вывод по блокам?
У меня получается, если ввести 1й факультет и 2й курс программа выдаст 5 подходящих студентов, если же потом ответить "да" на вопрос о выводе следующих подходящих студентов то мне выводятся и те студенты который не принадлежат 2у курсу.
Заранее спасибо, если кто поможет.
nvova, 16.12.2006 - 16:07
Вывод на экран по блокам:
CODE
while (b!=0)
{
for (int i=5*r;i<(5*r+5);i++)
{
if ((fread(&Tmp,g,1,v)!=0)&&(Tmp.fk==f)&&(Tmp.kurs==k))
cout<<Tmp.fam<<" "<<Tmp.name<<" "<<Tmp.otch<<" gruppa:"<<Tmp.gr<<" god:"<<Tmp.god<<"\n";
}
cout<<"vevodit' dalshe? 1-Da, 0-Net";
cin>>b;r++;
}
Добавлено:Может, кто подскажет, как сделать, чтоб русские буковки в консоли можно было использовать? (VS 2005)
Был уже этот вопрос, но не помогло.
ZaHack, 16.12.2006 - 17:58
nvova, открываешь файл с исходниками (*.срр) блокнотом, формат -> шрифт -> Terminal . Пишешь русские надписи шрифтом Terminal (DOS-кодировка)., а потом переключаешь на шрифт System или любой другой (вин32 кодировка). И усе.
nvova, 16.12.2006 - 19:24
QUOTE(ZaHack @ 16.12.2006 - 18:58)
Пишешь русские надписи шрифтом Terminal
Он русские буковки пишет крякозябликами....
Переключаешь - всё ок. Но после компиляции - всё равно фигня с русским
Видимо, надо это как-то в VS настраивать.