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

  1. Punter d'Arxiu: És un indicador que manté la posició actual dins d'un arxiu obert.
  2. Funcions de Posicionament: Les funcions fseek(), ftell(), i rewind() 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:

int fseek(FILE *stream, long int offset, int whence);
  • stream: Punter a l'arxiu.
  • offset: Nombre de bytes a moure des de la posició indicada per whence.
  • 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:

long int ftell(FILE *stream);
  • 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:

void rewind(FILE *stream);
  • 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 i fseek() 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

Mòdul 2: Tipus de Dades i Variables

Mòdul 3: Flux de Control

Mòdul 4: Funcions

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

Mòdul 10: Temes Avançats

Mòdul 11: Millors Pràctiques i Optimització

Mòdul 12: Projecte i Avaluació Final

© Copyright 2024. Tots els drets reservats