Чтение данных из файла в массив структур. - 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;// считывем отметку и переводим курсор на сл строчку
 
    }
}

Объяснение кода листинга программы

  1. Объявляется функция input с двумя параметрами: t и n.
  2. Создается объект класса fstream file, который открывает файл input.txt в бинарном режиме.
  3. В случае успешного открытия файла, создается объект класса ifstream in, который ссылается на файл input.txt.
  4. Используя оператор >>, происходит чтение данных из файла в массив структур. Фамилия студента считывается в поле surname, группа - в поле group, зачетная книжка - в поле record_book, а также считываются три поля с отметками - mark_geo, mark_man и mark_prog.
  5. Переменная n увеличивается на единицу после каждого успешного чтения данных.
  6. Выводится сообщение General list of students на консоль.
  7. Запускается цикл, который проходит по всем элементам массива структур и выводит их значения на консоль.
  8. Значения полей surname, group, record_book, mark_geo, mark_man и mark_prog выводятся на консоль с помощью оператора <<.
  9. После каждого вывода значения, курсор переводится на новую строку с помощью оператора <<.
  10. Если файл не может быть открыт, программа выдает ошибку.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5
Похожие ответы