Concaténation de deux fichiers

#include "t_bool.h"
#include "file_tools.h"

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


/* Nom du fichier temporaire. */
#define TEMP_FILE "example.txt"

/* Liste, non exhaustive, de delimiteurs */
#define DELIM " *§:/;!.,?&~<>{([|])}\"\\+="

/* -----------------------------------------------------
   file_tools_concat
   -----------------------------------------------------
   Concatenation de fichiers.
   -----------------------------------------------------
   arg   : Fichier 1.
   arg   : Fichier 2 a concatener dans le fichier 1.
   return: true si la concatenation est un succes 
           sinon false.
   ----------------------------------------------------- */
t_bool file_tools_concat (char const * const s_file1,
                          char const * const s_file2)
{
    FILE * p_file_1 = NULL;
    FILE * p_file_2     = NULL;
    char * s_buffer   = NULL;
    int nb_read = 0;
    t_bool bool = true;


    /* ----- Verification des arguments ----- */

    if (!s_file1 || !s_file2) {
        /* Erreur: arguments invalides. */
        return false;
    }

    /* ----- */


    /* ----- Ouverture des fichiers ----- */

    /* Ouverture du fichier 1. */
    p_file_1 = fopen (s_file1, "ab");

    if (!p_file_1) {
        /* Erreur: impossible d'ouvrir le fichier 1. */
        return false;
    }


    /* Ouverture du fichier a concatener avec 1. */
    p_file_2 = fopen (s_file2, "rb");

    if (!p_file_2) {
        /* Erreur: impossible d'ouvrir le fichier a 
            concatener avec file 1. */
        fclose (p_file_1);
        return false;
    }

    /* ----- Allocation du buffer temporaire ----- */

    s_buffer = malloc (BUFSIZ);

    if (!s_buffer) {
        /* Erreur: impossible d'allouer l'espace requis. */
        fclose (p_file_1);
        fclose (p_file_2);
        return false;
    }

    /* ----- Concatenation des fichiers ----- */

    while ((nb_read = fread (s_buffer, 
                1, BUFSIZ, p_file_2)) != 0) {
        fwrite (s_buffer, 1, nb_read, p_file_1);
        memset (s_buffer, 0, sizeof (s_buffer));
    }

    /* Fermeture des fichiers. */
    fclose (p_file_1);
    fclose (p_file_2);

    /* Liberation du buffer temporaire. */
    free (s_buffer);
    s_buffer = NULL;

    return bool;
}




  Vous pouvez retrouver cette fonction ainsi que toutes les autres fonctions de la catégorie Fichier dans l'archive file_tools.zip.

L'archive comprends les fichiers suivants :

  • example1.txt et example2.txt deux fichiers utilisés par la méthode main.
  • t_bool.h : déclaration du type booléen.
  • file_tools.h et file_tools.c : déclaration et implémentation des fonctions de la catégorie Fichier.
  • main.c : fonction permettant et mettant en œuvre l'ensemble des fonctions Fichier.

  Exécution

$gcc main.c file_tools.c -o filetools
$chmod +x filetools
$./filetools