Anda di halaman 1dari 15

Tcnicas de Programao

Ficheiros em C
A biblioteca com todas as funes necessrias para manusear

ficheiros a stdio.h
Em C, um pouco como nas outras linguagens, existem funes

para:
Manusear ficheiros de texto Manusear ficheiros binrios

Tcnicas de Programao

Abrir e Fechar um Ficheiro


#include <stdio.h> int main() { char *str1 = "dados.txt"; FILE *fp; fp=fopen (str1,"r"); if (fp) printf("Ficheiro aberto com sucesso."); else printf("Erro na abertura do ficheiro."); fclose(fp); return 0; }

A abertura de um ficheiro feita com a funo fopen e o fecho com a

funo fclose. Tem que existe sempre um ponteiro para acedermos ao ficheiro (FILE *fp) Se no nome do ficheiro colocarmos dados.txt estamos a trabalhar no directoria actual, ou com caminhos relativos Se indicarmos o caminho completo para o ficheiro c:\\pasta\\dados.txt estamos a trabalhar com caminhos absolutos
Ateno s duas barras \\

fopen
O primeiro parmetro do fopen uma string para a localizao do

ficheiro:

dados.txt dir1\\dir2\\dados.txt .\\dir1\dados.txt c:\\dir1\\dir2\\dados.txt ..\\dir1\\dados.txt

O segundo parmetro indica o modo de abertura


r abre para leitura, ficando a apontar para o inicio do ficheiro, se este no

existir a funo devolve NULL w abre para escrita, se o ficheiro no existir, cria-o, seno apaga o seu contedo a abre para escrita, se o ficheiro no existir, cria-o, seno fica a apontar para o fim do ficheiro r+ - abre para leitura e escrita, ficando com o mesmo comportamento do r w+ - abre para escrita e leitura, ficando com o mesmo comportamento do w a+ - abre para escrita e leitura, ficando com o mesmo comportamento do a

Escrita e leitura de caracteres


#include <stdio.h> int main() { char *str1 = c:\\dados.txt"; FILE *fp; fp=fopen (str1,"w"); if (fp) { fputc('O', fp); fputc('L', fp); fputc('A', fp); } fflush(fp); fclose(fp); return 0; } } #include <stdio.h> int main() { char *str1 = "c:\\dados.txt"; FILE *fp; fp=fopen (str1,"r"); if (fp) { while (!feof(fp)) { printf("%c", fgetc(fp)); } } fclose(fp); return 0;

A funo fputc, permite escrever um caracter e a funo fgetc, ler um

caracter. recomendado, quando se escreve em ficheiros, usar a funo fflush, para gravar alguma informao que possa estar em buffer antes de fechar o ficheiro. Existe ainda a funo feof, que permite saber se chegamos ao fim do ficheiro ou no

Escrita formatada
#include <stdio.h> int main() { char *str1 = "c:\\dados.txt"; FILE *fp; fp=fopen (str1,"w"); if (fp) { fprintf(fp, "%d",123); // escreve um inteiro fprintf(fp, "%f", 10.54); // um float fprintf(fp, "%c", 'b'); // um char fprintf(fp, "%d %f %c", 12, 3.12, 'a'); // e muitas coisas } fflush(fp); fclose(fp); return 0; }

A funo fprintf, possui uma sintaxe semelhante funo printf,

sendo necessrio acrescentar o ponteiro para o ficheiro Existe ainda a funo fputs:
fputs(ola mundo, fp);

Leitura formatada
#include <stdio.h> int main() { char *str1 = "c:\\dados.txt"; FILE *fp; int i; float f; char c; fp=fopen (str1,"r"); if (fp) { fscanf(fp, "%d",&i); // Le um inteiro printf("%d", i); fscanf(fp, "%f", &f); // um float printf("%f", f); fscanf(fp, "%c", &c); // um float printf("%f", f); fscanf(fp, "%d %f %c", &i, &f, &c); // e muitas coisas printf("%d %f %c", i, f, c); } fclose(fp); return 0; }

A funo fscanf, possui uma sintaxe semelhante funo scanf, sendo

necessrio acrescentar o ponteiro para o ficheiro Existe ainda a funo fgets:

Exemplo: fgets(str, 10, fp); L 10 caracteres para str ou at encontrar um \n

Tcnicas de Programao

Abrir e Fechar um Ficheiro


#include <stdio.h> int main() { char *str1 = "dados.txt"; FILE *fp; fp=fopen (str1,"rb"); // leva o b a mais if (fp) printf("Ficheiro aberto com sucesso."); else printf("Erro na abertura do ficheiro."); fclose(fp); return 0; }

A abertura de um ficheiro feita com a funo fopen e o fecho com a

funo fclose. Tem que existe sempre um ponteiro para acedermos ao ficheiro (FILE *fp) Se no nome do ficheiro colocarmos dados.txt estamos a trabalhar no directoria actual, ou com caminhos relativos Se indicarmos o caminho completo para o ficheiro c:\\pasta\\dados.txt estamos a trabalhar com caminhos absolutos
Ateno s duas barras \\

fopen
No segundo parmetro indica o modo de abertura binario
rb abre para leitura, ficando a apontar para o inicio do

ficheiro, se este no existir a funo devolve NULL wb abre para escrita, se o ficheiro no existir, cria-o, seno apaga o seu contedo ab abre para escrita, se o ficheiro no existir, cria-o, seno fica a apontar para o fim do ficheiro rb+ - abre para leitura e escrita, ficando com o mesmo comportamento do r wb+ - abre para escrita e leitura, ficando com o mesmo comportamento do w ab+ - abre para escrita e leitura, ficando com o mesmo comportamento do a

Escrita em ficheiro binrios


#include <stdio.h> int main() { char *str1 = "c:\\dados.dat"; FILE *fp; int a[4] = {1,2,3,4}; fp=fopen (str1,"wb"); if (fp) { fwrite(a, sizeof(a), 1, fp); } fflush(fp); fclose(fp); return 0; }

A funo fwrite, permite escrever um conjunto de bytes num ficheiro. O 1 parmetro a informao O 2 parmetro o numero de bytes que se vai escrever O 3 parmetro a quantidade de vezes que se vai escrever

No exemplo, se usa-se 4, iria escrever 4 vezes o array a

O 4 parmetro o ponteiro para o ficheiro.

Leitura em ficheiro binrios


#include <stdio.h> int main() { char *str1 = "c:\\dados.dat"; FILE *fp; int a[4]; fp=fopen (str1,"rb"); if (fp) { fread(a, sizeof(a), 1, fp); } printf("%d %d %d %d", a[0], a[1], a[2], a[3]); fclose(fp); return 0; }

A funo fread semelhante fwrite, s que l em vez de escrever O 1 parmetro a informao O 2 parmetro o numero de bytes que se vai ler O 3 parmetro a quantidade de vezes que se vai ler O 4 parmetro o ponteiro para o ficheiro.

Tcnicas de Programao

Posicionamento em ficheiros
A funo ftell permite saber em que posio estamos: long pos = ftell(fp);

A funo fseek permite avanar ou recuar o ponteiro que

aponta para o ficheiro:


fseek(fp, 4, SEEK_SET); // Avana 4 bytes a partir do inicio do

ficheiro fseek(fp, 4, SEEK_CUR): // Avana 4 bytes a partir da posio actual fseek(fp, -4, SEEK_CUR): // Recua 4 bytes a partir da posio actual fseek(fp, -4, SEEK_END): // Recua 4 bytes a partir do fim do ficheiro
fseek(fp, -4, SEEK_SET); // No faz sentido fseek(fp, 4, SEEK_END); // No faz sentido