Чтение данных из файла в массив структур. - C (СИ)
Формулировка задачи:
Нужна помощь, не могу понять почему оно не хочет считывать с файла, записывает нормальна а вот данные считать и в структуру запхать не получается вот код, надеюсь на помощь
#include <stdio.h>
#include <iostream>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
const int NotUsed = system( "color f0" );
int i=0,n=0,mm; char r[20];
struct ABONENT
{
char NAME[30];
char LOGIN[30];
int PASSWORD;
char TYPE[30];
char DATE[10];
}st[20];
void Edit()
{
printf("NAME\n");
int f=0;
int q;
cin>>r;
for (int i=0;i<n;i++)
{
for(q=0;q<strlen(r);q++)
if (strcmp(r,st[i].NAME)==0)
{
f=f+1;
cout<<"Stara informacia\n";
printf("%s\n%s\n%d\n%s\n%s\n",st[i].NAME,st[i].LOGIN,
st[i].PASSWORD,st[i].PASSWORD,st[i].TYPE,st[i].DATE);
cout<<"Type abonent info\n NAME ";
cin>>st[i].NAME;
cout<<"LOGIN ";
cin>>st[i].LOGIN;
cout<<"PASSWORD ";
cin>>st[i].PASSWORD;
cout<<"TYPE ";
cin>>st[i].TYPE;
cout<<"DATE ";
cin>>st[i].DATE;
}
}
if (f==0)
cout<<"There's no abonements";
}
void Search()
{
int pl;
cout<<"Choose the number\n1-- NAME\n2-- LOGIN\n3-- PASSWORD\n4-- TYPE\n5-- DATE\n";
cin>>pl;
switch (pl)
{
case 1:
{
int f=0;
cout<<"NAME ---- \n";
cin>>r;
for (i=0;i<n;i++)
{
if (strcmp(r,st[i].NAME)==0)
{
f++;
printf("%s\n%s\n%d\n%s\n%s\n",st[i].NAME,st[i].LOGIN,st[i].PASSWORD,st[i].TYPE,st[i].DATE);
}
}
if (f==0)cout<<"There's no abonents";
break;
}
case 2:
{
cout<<"LOGIN ";
int f=0;
cin>>r;
for (i=0;i<n;i++)
if (strcmp(r,st[i].LOGIN)==0)
{
printf("%s\n%s\n%d\n%s\n%s\n",st[i].NAME,st[i].LOGIN,
st[i].PASSWORD,st[i].TYPE,st[i].DATE);
f++;
}
if (f==0)cout<<"There's no abonents";
break;
}
case 3:
{
cout<<"PASSWORD ";
int w,f=0;cin>>w;
for (i=0;i<n;i++)
if (st[i].PASSWORD==w)
{
printf("%s\n%s\n%d\n%s\n%s\n",st[i].NAME,st[i].LOGIN,
st[i].PASSWORD,st[i].TYPE,st[i].DATE);
f++;
}
if (f==0)cout<<"There's no abonents";
break;
}
case 4:
{
int f=0;
char w[6];
cout<<"TYPE";
cin>>w;
for (i=0;i<n;i++)
if (st[i].TYPE==w)
{
f++;
printf("%s\n%s\n%d\n%s\n%s\n",st[i].NAME,st[i].LOGIN,
st[i].PASSWORD,st[i].TYPE,st[i].DATE);
}
if (f==0)cout<<"There's no abonents";
break;
}
}
}
void add()
{
cout<<"Enter the quantity of records --- ";
int w;
cin>>w;
i=n;n=n+w;
for(i;i<n;i++)
{
cout<<"Enter abonent\nNAME\n";
cin>>st[i].NAME;
cout<<"LOGIN\n";
cin>>st[i].LOGIN;
cout<<"PASSWORD\n";
cin>>st[i].PASSWORD;
cout<<"TYPE\n";
cin>>st[i].TYPE;
cout << "DATA\n";
cin >> st[i].DATE;
}
}
void del()
{
printf("Type NAME ");
int free,f=0;
cin>>r;
for (i=0;i<n;i++)
{
if (strcmp(r,st[i].NAME)==0)
{
f++;
printf("%s\n%s\n%d\n%s\n%s\n",st[i].NAME,st[i].LOGIN,
st[i].PASSWORD,st[i].TYPE,st[i].DATE);
cout<<"Do you really want to delete this info ?? (y/n)";
char ___;
cin>>___;
if (___=='y')
{
for (free=i;free<n-1;free++)
{
st[free]=st[free+1];
}
n--;
cout<<"Success!\n";
}
}
}
if(f==0)
cout<<"There's no abonents";
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
int main ()
{
FILE *file;
file=fopen ("file.txt","rt");
do
{
if (i%5==0)
{
fgets(r,20,file); //zapppus info z fajlu v stucturu
strncpy(st[n].NAME,r,strlen(r)-1);
}
else
if (i%5==1)
{
fgets(r,20,file);
strncpy(st[n].LOGIN,r,strlen(r)-1);
}
else
if (i%5==2)
{
fscanf(file,"%d",&st[n].PASSWORD);
}
else
if (i%5==3)
{
fscanf(file,"%d",&st[n].TYPE);
}
else
if (i%5==4)
{
fscanf(file,"%d",&st[n].DATE);
}
i++;
}
while (!feof(file));
fsetpos(file,0); //
char f[10]; //vuvid info z fajlu
do
{
fgets(f,10,file);
printf(f);
}
while (!feof(file));
fclose (file); //zakruttja
cout<<"\n"; //n=i/4;
//---------------------------------------------------------------------------------------------------------------------
printf("Psts any key to continue\n");
getch(); //vubir neobxidnoji func
begin: system("cls");
cout<<"Choose the function\n1-- Edit\n2-- Search\n3-- Add\n4-- Delete\n5-- exit\n";
cin>>mm;
switch (mm)
{
case 1: {Edit();break;} //redaguvannja
case 2: {Search();break;} //powuk
case 3: {add();break;} //dodavannja
case 4 : {del();break;} //vudalennja
case 5 : {goto finish;} //the end =)
}
//-----------------------------------------------------------------------------------------------------------------
cout<<"\nContinue ?? (y/n)";
char ___;
cin>>___;
if (___=='y')
goto begin;
finish:
file=fopen("file.txt","wt");
for (i=0;i<n;i++)
{
fprintf(file,"%s\n%s\n%d\n%s\n%s\n",st[i].NAME,st[i].LOGIN,st[i].PASSWORD,st[i].TYPE,st[i].DATE);
}
fclose (file);
}Решение задачи: «Чтение данных из файла в массив структур.»
textual
Листинг программы
void input(Student *t, int &n)//считывание студентов
{
fstream file;//открыть поток
file.open("input.txt", ios::in|ios::binary);//открыть файл в бинарном режиме
ifstream in;//
in.open("input.txt");//открыть файл
while(in>>(t+n)->surname>>(t+n)->group>>(t+n)->record_book>>(t+n)->mark_man>>(t+n)->mark_geo>>(t+n)->mark_prog)//пока еще возможно считывать
n++;// счетчик студентов
cout<<"General list of students"<<endl;//вывод на консоль сообщения
for(int i=0; i<n; i++)//запускаем цикл до конца студентов
{
cout<<t[i].surname<<' ' //считываем фамилию
<<t[i].group<<' ' //считываем группу
<<t[i].record_book<<' '// считываем зачетку
<<t[i].mark_geo<<' '// считываем отметку
<<t[i].mark_man<<' '// считываем отметку
<<t[i].mark_prog<<' '<<endl;// считывем отметку и переводим курсор на сл строчку
}
}
Объяснение кода листинга программы
- Объявляется функция input с двумя параметрами: t и n.
- Создается объект класса fstream file, который открывает файл
input.txtв бинарном режиме. - В случае успешного открытия файла, создается объект класса ifstream in, который ссылается на файл
input.txt. - Используя оператор >>, происходит чтение данных из файла в массив структур. Фамилия студента считывается в поле surname, группа - в поле group, зачетная книжка - в поле record_book, а также считываются три поля с отметками - mark_geo, mark_man и mark_prog.
- Переменная n увеличивается на единицу после каждого успешного чтения данных.
- Выводится сообщение
General list of studentsна консоль. - Запускается цикл, который проходит по всем элементам массива структур и выводит их значения на консоль.
- Значения полей surname, group, record_book, mark_geo, mark_man и mark_prog выводятся на консоль с помощью оператора <<.
- После каждого вывода значения, курсор переводится на новую строку с помощью оператора <<.
- Если файл не может быть открыт, программа выдает ошибку.