En aquest tema, aprendrem com manipular la posició del punter d'arxiu en C. Això és essencial per a operacions avançades de lectura i escriptura en arxius. Veurem les funcions bàsiques que ens permeten moure el punter d'arxiu i com utilitzar-les de manera efectiva.
Conceptes Clau
- Punter d'Arxiu: És un indicador que manté la posició actual dins d'un arxiu obert.
- Funcions de Posicionament: Les funcions
fseek()
,ftell()
, irewind()
són utilitzades per manipular i obtenir la posició del punter d'arxiu.
Funcions de Posicionament
fseek()
La funció fseek()
mou el punter d'arxiu a una posició específica dins de l'arxiu.
Sintaxi:
stream
: Punter a l'arxiu.offset
: Nombre de bytes a moure des de la posició indicada perwhence
.whence
: Punt de referència per al desplaçament. Pot ser:SEEK_SET
: Inici de l'arxiu.SEEK_CUR
: Posició actual del punter d'arxiu.SEEK_END
: Final de l'arxiu.
Exemple:
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return -1; } // Moure el punter d'arxiu a 10 bytes des de l'inici fseek(file, 10, SEEK_SET); // Llegir el caràcter en la nova posició int c = fgetc(file); if (c != EOF) { printf("Character at position 10: %c\n", c); } fclose(file); return 0; }
ftell()
La funció ftell()
retorna la posició actual del punter d'arxiu.
Sintaxi:
stream
: Punter a l'arxiu.
Exemple:
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return -1; } // Moure el punter d'arxiu a 10 bytes des de l'inici fseek(file, 10, SEEK_SET); // Obtenir la posició actual del punter d'arxiu long int pos = ftell(file); printf("Current position: %ld\n", pos); fclose(file); return 0; }
rewind()
La funció rewind()
mou el punter d'arxiu a l'inici de l'arxiu.
Sintaxi:
stream
: Punter a l'arxiu.
Exemple:
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return -1; } // Moure el punter d'arxiu a 10 bytes des de l'inici fseek(file, 10, SEEK_SET); // Tornar el punter d'arxiu a l'inici rewind(file); // Llegir el caràcter en la nova posició (inici) int c = fgetc(file); if (c != EOF) { printf("Character at the beginning: %c\n", c); } fclose(file); return 0; }
Exercicis Pràctics
Exercici 1: Lectura Inversa
Escriu un programa que llegeixi un arxiu de text i imprimeixi el seu contingut en ordre invers.
Pista:
- Utilitza
fseek()
per moure el punter d'arxiu al final i després moure't cap enrere.
Solució:
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return -1; } // Moure el punter d'arxiu al final fseek(file, 0, SEEK_END); long int pos = ftell(file); // Llegir el contingut en ordre invers for (long int i = pos - 1; i >= 0; i--) { fseek(file, i, SEEK_SET); int c = fgetc(file); if (c != EOF) { putchar(c); } } fclose(file); return 0; }
Exercici 2: Saltar Línies
Escriu un programa que llegeixi un arxiu de text i imprimeixi només cada segona línia.
Pista:
- Utilitza
fgets()
per llegir línies ifseek()
per saltar línies.
Solució:
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return -1; } char buffer[256]; int line_number = 1; while (fgets(buffer, sizeof(buffer), file) != NULL) { if (line_number % 2 == 0) { printf("%s", buffer); } line_number++; } fclose(file); return 0; }
Resum
En aquesta secció, hem après com manipular la posició del punter d'arxiu utilitzant les funcions fseek()
, ftell()
, i rewind()
. Aquestes funcions són essencials per a operacions avançades de lectura i escriptura en arxius. Hem vist exemples pràctics i hem realitzat exercicis per reforçar els conceptes apresos. En el proper tema, explorarem la gestió d'errors en operacions d'arxius.
Curs de Programació en C
Mòdul 1: Introducció al C
- Introducció a la Programació
- Configuració de l'Entorn de Desenvolupament
- Programa Hello World
- Sintaxi i Estructura Bàsiques
Mòdul 2: Tipus de Dades i Variables
Mòdul 3: Flux de Control
Mòdul 4: Funcions
- Introducció a les Funcions
- Arguments de Funció i Valors de Retorn
- Àmbit i Durada de les Variables
- Funcions Recursives
Mòdul 5: Arrays i Strings
Mòdul 6: Punteres
Mòdul 7: Estructures i Unions
Mòdul 8: Assignació Dinàmica de Memòria
Mòdul 9: Gestió d'Arxius
- Introducció a la Gestió d'Arxius
- Lectura i Escriptura d'Arxius
- Posicionament d'Arxius
- Gestió d'Errors en Operacions d'Arxius
Mòdul 10: Temes Avançats
- Directives del Preprocessador
- Arguments de Línia de Comandes
- Llistes d'Arguments Variables
- Multifil en C
Mòdul 11: Millors Pràctiques i Optimització
- Llegibilitat del Codi i Documentació
- Tècniques de Depuració
- Optimització del Rendiment
- Consideracions de Seguretat