This shows you the differences between two versions of the page.
programare-cc:laboratoare:11 [2021/01/12 20:04] viorel.mocanu [Problema 3A] |
programare-cc:laboratoare:11 [2023/12/20 14:41] (current) mihai.nan [Problema 1 (Rezolvata)] |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 11. Fişiere text. Argumente în linia de comandă ===== | ===== Laboratorul 11. Fişiere text. Argumente în linia de comandă ===== | ||
+ | |||
În acest laborator veţi învăţa să: | În acest laborator veţi învăţa să: | ||
* Citiţi şi scrieţi date din fişiere text. | * Citiţi şi scrieţi date din fişiere text. | ||
* Trimiteţi şi folosiţi argumente în linia de comandă. | * Trimiteţi şi folosiţi argumente în linia de comandă. | ||
+ | |||
+ | ====Fişiere text==== | ||
+ | Pentru a realiza operaţii cu fişiere text se folosesc funcţii şi structuri definite în stdio.h: | ||
+ | |||
+ | **FILE** este o structură ce conţine informaţiile necesare controlării unui fişier. | ||
+ | |||
+ | ''FILE * fopen ( const char * filename, const char * mode )'' asociază fişierul cu o structură FILE şi întoarce un pointer la această | ||
+ | structură. Dacă fişierul nu există sau nu a putut fi deschis, se va întoarce NULL. mode reprezintă modul de access dorit: | ||
+ | * **"r"** deschide fişierul pentru citire; fişierul trebuie să existe. | ||
+ | * **"w"** creează un fişier gol pentru scriere; dacă există deja un fişier cu acelaşi nume, conţinutul lui este şters şi este tratat ca un fişier gol. | ||
+ | * **"a"** adaugă datele la sfârşitul fişierului; fişierul este creat dacă nu există. | ||
+ | * **"r+"** deschide un fişier atât pentru scriere, cât şi pentru citire; fişierul trebuie să existe. | ||
+ | * **"w+"** creează un fişier gol atât pentru scriere, cât şi pentru citire; dacă există deja un fişier cu acelaşi nume, conţinutul lui este şters şi este tratat ca un fişier gol. | ||
+ | * **"a+"** deschide un fişier pentru citire şi adăugare la sfârşit; se poate citi de la orice poziţie din fişier, însă scrierea se face doar la sfârşit; fişierul este creat dacă nu există | ||
+ | |||
+ | ''int fclose ( FILE * file )'' închide fişierul asociat cu structura file şi îl dezasociază. | ||
+ | |||
+ | Funcţii de citire şi afişare pentru fişiere: | ||
+ | * ''int fgetc ( FILE * f );'' întoarce următorul caracter din fişier convertit la int sau EOF dacă sa întâlnit sfârşitul de fişier sau o eroare. | ||
+ | * ''char *fgets ( char *buf, int nmax, FILE * f )'' citeşte caractere din fişier până cănd se întâlneşte '\n' (este şi el adăugat la şir) sau până când sau citit nmax 1 caractere. | ||
+ | * ''int fputc ( int c, FILE * f )'' scrie caracterul c în fişier; funcţia întoarce caracterul scris, în caz de success sau EOF altfel. | ||
+ | * ''int fputs ( char *buf, FILE *f )'' scrie şirul buf în fişier; în caz de eroare se întoarce EOF, altfel se întoarce o valoare nonnegativă. | ||
+ | * ''int fscanf ( FILE *f, const char * format, ... )'' | ||
+ | * ''int fprintf ( FILE *f, const char * format, ... )'' | ||
+ | |||
+ | ====Argumente în linia de comandă==== | ||
+ | Pentru a specifica argumente în linia de comandă, antetul funcţiei main va trebui să fie de forma: | ||
+ | <code c> int main ( int argc, char *argv[] ); </code> | ||
+ | **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 1 (Rezolvata) ==== | ==== Problema 1 (Rezolvata) ==== | ||
Line 26: | Line 61: | ||
| | ||
pFile = fopen("myfile.txt" , "r"); | pFile = fopen("myfile.txt" , "r"); | ||
- | if (pFile == NULL) | + | if (pFile == NULL) { |
printf("Nu s-a putut deschide fisierul"); | printf("Nu s-a putut deschide fisierul"); | ||
+ | return 1; | ||
+ | } | ||
| | ||
while (fgets(buffer, BUFMAX, pFile) != NULL) { | while (fgets(buffer, BUFMAX, pFile) != NULL) { | ||
- | printf("%s", buffer); | + | printf("%s", buffer); |
} | } | ||
- | fclose(pFile); | + | fclose(pFile); |
+ | return 0; | ||
} | } | ||
</code> | </code> | ||
+ | |||
+ | |||
==== Problema 2 (Rezolvata) ==== | ==== Problema 2 (Rezolvata) ==== | ||
Scrieţi un program pentru concatenarea mai multor fişiere text întrun fişier destinaţie. Programul va primi numele fişierelor ca | Scrieţi un program pentru concatenarea mai multor fişiere text întrun fişier destinaţie. Programul va primi numele fişierelor ca | ||
- | argumente în linia de comandă, în următoarea ordine: destinatie sursa1 sursa2 ... sursan. | + | argumente în linia de comandă, în următoarea ordine: destinatie $sursa_1, sursa_2 \dots sursa_n$. |
==Date de intrare== | ==Date de intrare== | ||
- | Fişierele de intrare sursa1 sursa2 ... sursan. | + | Fişierele de intrare $sursa_1, sursa_2 \dots sursa_n$. |
==Date de ieşire== | ==Date de ieşire== | ||
Fişierele de intrare concatenate în fişierul destinaţie. | Fişierele de intrare concatenate în fişierul destinaţie. | ||
Line 89: | Line 129: | ||
==Exemplu== | ==Exemplu== | ||
Pentru a căuta în fişierul input.txt stringul vacanta: | Pentru a căuta în fişierul input.txt stringul vacanta: | ||
- | ./executabil input.txt vacanta | + | |
+ | **./executabil input.txt vacanta** | ||
^ input.txt ^ stdout ^ | ^ input.txt ^ stdout ^ | ||
Line 116: | Line 157: | ||
==Exemplu== | ==Exemplu== | ||
Dacă, căutăm în fişierul input.txt stringul vacanta: | Dacă, căutăm în fişierul input.txt stringul vacanta: | ||
- | ./executabil c i n input.txt vacanta | + | |
+ | **./executabil c i n input.txt vacanta** | ||
^ input.txt ^ stdout ^ | ^ input.txt ^ stdout ^ | ||
Line 138: | Line 180: | ||
==Exemplu== | ==Exemplu== | ||
Aplicăm algoritmul de codare pe fişierul input.txt şi vom obţine un fişier output.txt. | Aplicăm algoritmul de codare pe fişierul input.txt şi vom obţine un fişier output.txt. | ||
- | ./executabil tabela_de_codare.in input.txt output.txt | + | |
+ | |||
+ | **./executabil tabela_de_codare.in input.txt output.txt** | ||
^ Intrare (input.txt ) ^ Ieşire (output.txt) ^ | ^ Intrare (input.txt ) ^ Ieşire (output.txt) ^ |