Чтение данных из файла в массив структур. - 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 выводятся на консоль с помощью оператора <<.
- После каждого вывода значения, курсор переводится на новую строку с помощью оператора <<.
- Если файл не может быть открыт, программа выдает ошибку.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д