Manipulation de fichiers avec C, C++, API Windows et API Linux

C

En-tête : <stdio.h>

Fonctions principales :

  • FILE *fopen(const char *chemin, const char *mode);
  • int fclose(FILE *pointeur_fichier);
  • int fputc(int caractere, FILE *pointeur_fichier);
  • int fputs(const char *chaine, FILE *pointeur_fichier);
  • int fgetc(FILE *pointeur_fichier);
  • char *fgets(char *tampon, int taille, FILE *pointeur_fichier);

Exemple :

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *descripteur;
    descripteur = fopen("./test_c.txt", "w");
    if (descripteur == NULL) {
        perror("Échec de l'ouverture");
        exit(EXIT_FAILURE);
    }
    fprintf(descripteur, "Texte via fprintf\n");
    fputs("Texte via fputs\n", descripteur);
    fclose(descripteur);
    return 0;
}

C++

En-têtes : <fstream>, <iostream>

Fonctions et opérateurs :

  • void open(const char *nom_fichier, std::ios::openmode mode);
  • void close();
  • Opérateur d'insertion (<<) pour l'écriture.
  • Opérateur d'extraction (>>) pour la lecture.

Exemple :

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main() {
    // Écriture
    ofstream sortie;
    sortie.open("donnees_cpp.txt");
    if (!sortie) {
        cerr << "Erreur d'ouverture en écriture" << endl;
        return 1;
    }
    sortie << "Ligne 1" << endl;
    sortie << "Ligne 2" << endl;
    sortie.close();

    // Lecture
    ifstream entree;
    entree.open("donnees_cpp.txt");
    if (!entree) {
        cerr << "Erreur d'ouverture en lecture" << endl;
        return 1;
    }
    string ligne;
    while (getline(entree, ligne)) {
        cout << "Lu : " << ligne << endl;
    }
    entree.close();
    return 0;
}

API Windows

En-tête : <windows.h>

Fonctions courantes :

  • HANDLE CreateFile(LPCSTR nom_fichier, DWORD acces, DWORD partage, LPSECURITY_ATTRIBUTES securite, DWORD creation, DWORD attributs, HANDLE modele);
  • BOOL ReadFile(HANDLE fichier, LPVOID tampon, DWORD octets_a_lire, LPDWORD octets_lus, LPOVERLAPPED chevauchement);
  • BOOL WriteFile(HANDLE fichier, LPCVOID tampon, DWORD octets_a_ecrire, LPDWORD octets_ecrits, LPOVERLAPPED chevauchement);
  • DWORD SetFilePointer(HANDLE fichier, LONG deplacement, PLONG deplacement_haut, DWORD methode);
  • BOOL SetEndOfFile(HANDLE fichier);
  • BOOL CopyFile(LPCSTR source, LPCSTR destination, BOOL echouer_si_existe);
  • BOOL DeleteFile(LPCSTR nom_fichier);
  • BOOL MoveFile(LPCSTR ancien, LPCSTR nouveau);
  • BOOL CreateDirectory(LPCSTR chemin, LPSECURITY_ATTRIBUTES securite);
  • BOOL RemoveDirectory(LPCSTR chemin);
  • DWORD GetCurrentDirectory(DWORD taille, LPSTR tampon);
  • BOOL SetCurrentDirectory(LPCSTR chemin);

Exemple (copie de fichier) :

#include <windows.h>
#include <stdio.h>
#include <string.h>

int est_repertoire(const char *chemin) {
    WIN32_FIND_DATAA infos;
    HANDLE hRecherche = FindFirstFileA(chemin, &infos);
    if (hRecherche == INVALID_HANDLE_VALUE) return 0;
    int resultat = (infos.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
    FindClose(hRecherche);
    return resultat;
}

int main(int argc, char *argv[]) {
    if (argc < 3) {
        printf("Usage : %s source destination\n", argv[0]);
        return 1;
    }
    char source[MAX_PATH], dest[MAX_PATH];
    strncpy(source, argv[1], MAX_PATH);
    strncpy(dest, argv[2], MAX_PATH);

    if (est_repertoire(dest)) {
        strcat(dest, "\\");
        strcat(dest, source);
    }
    if (!CopyFileA(source, dest, FALSE)) {
        perror("Échec de la copie");
        return 1;
    }
    printf("Copie réussie.\n");
    return 0;
}

API Linux

En-têtes : <fcntl.h>, <unistd.h>

Fonctions de base :

  • int open(const char *chemin, int drapeaux);
  • int open(const char *chemin, int drapeaux, mode_t mode);
  • int creat(const char *chemin, mode_t mode);
  • ssize_t read(int descripteur, void *tampon, size_t taille);
  • ssize_t write(int descripteur, const void *tampon, size_t taille);
  • int close(int descripteur);

Exemple (copie de fichier) :

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define TAILLE_TAMPON 4096

int main(int argc, char *argv[]) {
    if (argc < 3) {
        fprintf(stderr, "Usage : %s source destination\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    int desc_source = open(argv[1], O_RDONLY);
    if (desc_source < 0) {
        perror("Erreur ouverture source");
        exit(EXIT_FAILURE);
    }
    int desc_dest = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (desc_dest < 0) {
        perror("Erreur ouverture destination");
        close(desc_source);
        exit(EXIT_FAILURE);
    }
    char tampon[TAILLE_TAMPON];
    ssize_t octets_lus;
    while ((octets_lus = read(desc_source, tampon, TAILLE_TAMPON)) > 0) {
        if (write(desc_dest, tampon, octets_lus) != octets_lus) {
            perror("Erreur d'écriture");
            close(desc_source);
            close(desc_dest);
            exit(EXIT_FAILURE);
        }
    }
    close(desc_source);
    close(desc_dest);
    return 0;
}

Étiquettes: C C++ API Windows API Linux fichiers

Publié le 22 juin à 18h09