Programarea Calculatoarelor, seria CC

Echipa de PC vă dorește vacanța plăcută și un

Laborator 12

Fișiere text. Argumente în linia de comandă

În acest laborator veţi învăţa să:



Fișiere text

Pentru a realiza operații cu fișiere text se folosesc funcții și structuri definite în stdio.h:

Funcții de citire și afișare pentru fișiere:


Argumente în linia de comandă

Pentru a specifica argumente în linia de comandă, antetul funcției main va trebui să fie de forma:

int main ( int argc, char *argv[] );

argc reprezintă numărul de argumente, iar argv vectorul de pointeri la argumente (șiruri de caractere). Primul argument argv[ 0 ] este întotdeauna numele executabilului.

Pentru a seta argumentele din CodeBlocks va trebui să adăugați fișierul sursă la un proiect și apoi să selectați: Project -> Set programs' arguments.


Problema 0 - Problemă rezolvată

Scrieți un program care citește conținutul unui fișier text myfile.txt și îl trimite către stdout.

#include <stdio.h>

#define BUFMAX 1005

int main(int argc, char **argv)
{
        FILE * pFile;
        char buffer [BUFMAX];

        pFile = fopen("myfile.txt" , "r");
        if (pFile == NULL)
		fprintf(stderr, "Eroare! Nu am putut deschide fisierul!\n");
        else
        {
                while (fgets(buffer, BUFMAX, pFile) != NULL)
			{
                        fputs (buffer, stdout);
                }
                fclose (pFile);
        }
        return 0;
}

Problema 1 - Problemă rezolvată

Scrieți un program pentru concatenarea mai multor fișiere text într-un fișier destinație. Programul va primi numele fișierelor ca argumente în linia de comandă, în următoarea ordine: destinatie sursa1 sursa2 ... sursan.

#include <stdio.h>

#define BUFMAX 1005

int main(int argc, char *argv[])
{
        FILE *dest, *src;
        int i;
        char buffer[BUFMAX];

        dest = fopen(argv[1], "w");
                if (!dest) fprintf(stderr, "Eroare! Nu am putut deschide fisierul destinatie!\n");

        for (i = 2; i < argc; ++i) {
                src = fopen(argv[i], "r");
                                if (!src) fprintf(stderr, "Eroare! Nu am putut deschide fisierul sursa (%d)!\n", i);
                while (fgets(buffer, BUFMAX, src) != NULL)
                        fputs(buffer, dest);
                fclose(src);
        }

        fclose(dest);
        return 0;
}

Problema 2.

A.

Scrieți un program pentru căutarea unui șir dat într-un fișier text și afișarea liniilor care conțin șirul dat. Fișierul și șirul căutat vor fi trimise ca argumente în linia de comandă, în această ordine.

Exemplu:

Daca căutăm în fișierul input.txt stringul vacanta:

./executabil input.txt vacanta

Intrare (din fisierul input.txt) Ieşire (stdout)
Mai e putin si vine vacanta !
Mie nu imi plac pointerii dar iubesc vacanta !
Abia astept sesiunea !
Haideti sa mergem la un suc chiar acum !
Cine stie sa se dea cu placa de snowboard ?!
Vacanta asta merg la Predeal si ma dau cu placa :)
Ma asteapta o sesiune infernala :-(
Vine vacanta cu trenul din Franta ...
La multi ani 2011 !
Mai e putin si vine vacanta !
Mie nu imi plac pointerii dar iubesc vacanta !
Vine vacanta cu trenul din Franta ...

B.

Adăugați programului de la punctul A posibilitatea de a primi ca argumente și una sau mai multe dintre următoarele opțiuni (ultimele 2 argumente vor fi întotdeauna numele fișierului și șirul căutat):

Exemplu:

Daca căutăm în fișierul input.txt stringul vacanta:

./executabil -i -n -c input.txt vacanta

Intrare (din fisierul input.txt) Ieşire (stdout)
Mai e putin si vine vacanta !
Mie nu imi plac pointerii dar iubesc vacanta !
Abia astept sesiunea !
Haideti sa mergem la un suc chiar acum !
Cine stie sa se dea cu placa de snowboard ?!
Vacanta asta merg la Predeal si ma dau cu placa :)
Ma asteapta o sesiune infernala :-(
Vine vacanta cu trenul din Franta ...
La multi ani 2011 !
[1] Mai e putin si vine vacanta !
[2] Mie nu imi plac pointerii dar iubesc vacanta !
[6] Vacanta asta merg la Predeal si ma dau cu placa :)
[8] Vine vacanta cu trenul din Franta ...
Numar total de linii: 4


Problema 3.

Se dă un fișier text ce conține informațiile despre situația la o anumită materie a unei grupe de studenți. Pentru fiecare student există în fișier o linie de forma:

Nume Prenume nota_activitate nota_examen

Să se definească o structură STUDENT care reține aceste informații.

Să se scrie un program care afișează:

Exemplu:

Intrare (input.txt) Ieşire (output.txt)
6
Dinca Alexandru 8.4 9.5
Georgescu Andrada 9.4 10
Ghitulete Razvan 9.3 9.2
Scoica Adrian 10 9.5
Tabara Mihai 7.2 8.5
Tiriplica Diana 9.5 9.5
Nota finala Dinca Alexandru: 9.13
Nota finala Georgescu Andrada: 9.80
Nota finala Ghitulete Razvan: 9.23
Nota finala Scoica Adrian: 9.66
Nota finala Tabara Mihai: 8.06
Nota finala Tiriplica Diana: 9.50
5 studenti promovati.
100%(procent de promovabilitate)
0 studenti au obtinut nota finala maxima

Problema 4.

Se dă un fișier în care este memorată o tabelă de codificare, sub forma:

caracter_de_codificat caracter_codificat \n

Să se scrie un program care primește ca argumente în linia de comandă tabela de codificare, fișierul de codificat și numele fișierului în care se va scrie codificarea (în această ordine) și codifică fișierul primit conform codului.

Presupunem un fișier tabela_de_codare.in care reține următoarele corespondențe:

Exemplu:

tabela_de_codare.in
a b
b c
c d
d e
e f
f g
g h
h i
i j
j k
k l
l c
m n
n o
o p
! ?
? !

Aplicăm algoritmul de codare în fișierul input.txt și vom obține un fișier output.txt.

./executabil tabela_de_codare.in input.txt output.txt

Exemplu:

Intrare (input.txt) Ieşire (output.txt)
Abia astept examenul de PL !
In vacanta dorm. Dorm pe partie !
Cine vrea sa se joace PACMAN ?
Voi n-aveti somn azi ?
BCjb bstfpt fxbnfouc ef PC ?
Jo vbdbotb eprn. Eprn pf pbrtjf ?
Djof vrfb sb sf kpbdf PBDNBO !
Vpj o-bvftj spno bzj !