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
