next up previous contents
Next: Probleme propuse Up: Prelucrarea fisierelor Previous: Citirea si scrierea cu   Cuprins


Probleme rezolvate

  1. Sa se scrie un program care afiseaza lungimea celei mai lungi linii din fisierul text TEST:
    /*------------------------------------------------*/
    /*                                                */
    /* afiseaza lungimea lg_max a celei mai lungi     */    
    /*           linii a fisierului                   */
    /*                                                */
    /*------------------------------------------------*/
    
    #include <stdio.h>
    
    void main(void)
    {
      FILE *f;
      char c;
      int lg_max, lg_curenta;
    
      lg_max=lg_curenta=0;
    
      if (!(f=fopen("TEST", "r")))
      {
        puts("Fisierul TEST nu poate fi deschis");
        return;
      }
    
      while ((c=getc(f))!=EOF)
        if (c=='\n')
        {
          if (lg_max<lg_curenta)
            lg_max = lg_curenta;
          lg_curenta = 0;
        }
        else
          lg_curenta++;
    
      fclose(f);
      printf ("\nLinia cea mai lunga are lungimea %d", lg_max);
    }
    
  2. Sa se scrie un program care copiaza un fisier binar sursa în alt fisier binar destinatie.
    /*---------------------------------------*/
    /*                                       */
    /* copiaza continutul unui fisier binar  */
    /*        in alt fisier binar            */
    /*                                       */
    /----------------------------------------*/
    
    #include <stdio.h>
    
    void main(void)
    {
      FILE *fs, *fd;
      char c;
    
      if ((fs=fopen("sursa", "rb"))==NULL)
      {
        fprintf(stderr, "Fisierul sursa nu poate fi deschis\n");
        return;
      }
    
      if ((fd=fopen("dest", "wb"))==NULL)
      {
        fprintf(stderr, "Fisierul dest nu poate fi deschis\n");
        return;
      }
    
      c=getc(fs);
      while (!feof(fs))
      {
        putc(c, fd);
        c=getc(fs);
      }
      
      fclose(fs);
      fclose(fd);
    }
    
  3. Sa se realizeze un program care pastreaza evidenta unei grupe de studenti. Datele despre studenti (numele, vârsta, media) se pastreaza sub forma unui fisier text. Programul trebuie sa permita urmatoarele optiuni:
    /*----------------------------------------------*/
    /*                                              */     
    /*    evidenta unei grupe de studenti           */     
    /*                                              */     
    /*----------------------------------------------*/
    
    #include <stdio.h>
    #include <conio.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <string.h>
    #define LNUME  20  /* lungimea maxima a numelor  */
    
    typedef struct 
    {
      char nume[LNUME];
      int varsta;
      float medie;
    } student;
    
    char fisier[13];    /* numele fisierului */
    
    /*---------------------------------------------------*/
    /*                                                   */
    /*  adauga datele unui nou student in fisier         */
    /*                                                   */
    /----------------------------------------------------*/
    
    void AdaugStudent(void)
    {
      FILE *f;
      student s;
    
      if (!(f=fopen(fisier, "at")))
      {
        puts("\nFisierul nu poate fi deschis.");
        return;
      }
    
      printf("\nNumele, varsta, media: ");
      scanf("%s %d %f", s.nume, &s.varsta, &s.medie);
    
      fflush(stdin); /* se goleste buffer-ul tastaturii */
      fprintf(f, "%20s %2d %6.2f\n", s.nume, s.varsta, s.medie);
      fclose(f);
    }
    
    /*-------------------------------------------*/
    /*                                           */
    /*  afiseaza datele tuturor studentilor      */
    /*                                           */
    /*--------------------------------------------*/
    
    void ListezStudenti(void)
    {
      FILE *f;
      student s;
    
      if (!(f=fopen(fisier, "rt")))
      {
        puts("\nFisierul nu poate fi deschis.");
        return;
      }
    
      while(fscanf(f,"%s %d %f",s.nume,&s.varsta,&s.medie)!=EOF)
        printf("\n%-20s %-2d %-6.2f\n",s.nume,s.varsta,s.medie);
    
      fclose(f);
    }
    
    
    /*-----------------------------------------------*/
    /*                                               */
    /*           modifica  datele studentului        */
    /*    al carui nume se citeste in variabila n    */
    /*                                               */
    /*-----------------------------------------------*/
    
    void ModificStudent(void)
    {
      int gasit=0;
      FILE *f;
      student s;
      char n[LNUME]; /* numele studentului ale */
                     /* carui date se vor modifica */
    
      if (!(f=fopen(fisier, "r+t")))
      {
        puts("Fisierul nu poate fi deschis.");
        return;
      }
    
      printf("\nNume student: ");
      fgets(n, LNUME, stdin);
    
      while(fscanf(f,"%s %d %f",s.nume,&s.varsta,&s.medie)!=EOF)
        if (!strcmp(n,s.nume))
        { /* studentul a fost gasit, se afiseaza datele sale */
          printf("%-20s %-2d %-6.2f\n",s.nume,s.varsta,s.medie);
          gasit=1;
          break;
        }
    
      if (!gasit)
        printf("\nStudentul %s nu exista in fisier.", n);
      else
      {
        printf("\nNumele, varsta, media: ");
        scanf("%s %d %f", s.nume, &s.varsta, &s.medie);
        fflush(stdin);
        
        /* pozitionare la inceputul inregistrarii */
        fseek(f, -30, SEEK_CUR); 
    
        fprintf(f,"%20s %2d %6.2f\n", s.nume, s.varsta, s.medie);
      }
     
      fclose(f);
    }
    
    /*----------------------------------*/
    /*                                  */
    /*   afiseaza meniul programului    */
    /*                                  */
    /*----------------------------------*/
    
    void AfisezMeniu(void)
    {
      puts("\na, A ---- adaugare student");
      puts("m, M ---- modificare date student");
      puts("l, L ---- listare studenti");
      puts("x, X ---- parasire program");
    }
    
    void main(void)
    {
      char opt;
    
      puts("Nume fisier: ");
      fgets(fisier, 13, stdin);
    
      while (1)
      {
        AfisezMeniu();
        opt=tolower(getche());
     
        switch(opt)
        {
        case 'a':
          AdaugStudent(); break;
        case 'm':
          ModificStudent(); break;
        case 'l': 
          ListezStudenti(); break;
        case 'x':
          exit(0);
        default:
          puts("Comanda eronata\n");
        }
      }
    }
    
    Se observa ca cele trei operatii principale efectuate asupra fisierului: adaugare, listare si modificare sunt implementate în trei functii distincte.

    Functia adauga înscrie în fisier datele unui student sub forma unei înregistrari de 30 de octeti (20 pentru nume, 1 spatiu, 2 pentru vârsta, 1 spatiu, 6 pentru medie). Acest lucru este folosit în functia modifica când se repozitioneaza indicatorul de pozitie în fisier la începutul înregistrarii care urmeaza a fi modificata.


next up previous contents
Next: Probleme propuse Up: Prelucrarea fisierelor Previous: Citirea si scrierea cu   Cuprins
Cristian Gavrila 2001-10-02