Fichier texte et comparaison

Signaler
Messages postés
40
Date d'inscription
mardi 4 novembre 2008
Statut
Membre
Dernière intervention
17 mars 2010
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonsoir!

J'aimerais avoir de l'aide svp , j'ai un fichier texte qui se compose de la forme suivante :

Bonjour
hello

j'aimerais pouvoir parcourir ce fichier et parcourir chaque ligne afin de recuperer le mot et pouvoir l'utiliser dans une fonction qui me permet de voir si ce mot est présent dans une chaine de caractere via la fonction strstr.
j'avais penser à stocker chaque ligne dans une case d'un tableau mais je n'ai pas reussi a le faire peut être existe t'il une maniere plus facile?
J'arrive a ouvrir le fichier sans probleme mais après je bloque je ne voit pas comment faire?
Merci pour votre aide :)!
en esperant avoir été clair sur ma demande ,
cdt.

2 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,

Voilà un bout de code qui charge chaque ligne dans un tableau. Pour avoir un minimum de perfs, l'idée est charger le fichier en une seule fois et de remplacer les \n et \r par des zéros terminaux.

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

FILE *SafeOpenFile(char *lpFileName, char *lpMode, FILE **lpFile)
{
  *lpFile = fopen(lpFileName, lpMode);

  if (! *lpFile)
    printf("Cannot open file: "%s"\n", lpFileName);

  return *lpFile;
}

long GetSizeOfFile(FILE* lpFile)
{
  long nCurrentPos;
  long nResult;

  nCurrentPos = ftell(lpFile);

  fseek(lpFile, 0, SEEK_END);
  nResult = ftell(lpFile);

  fseek(lpFile, nCurrentPos, SEEK_SET);

  return nResult;
}

char* LoadFile(FILE* lpFile)
{
  long nFileSize;
  char* lpResult;

  nFileSize = GetSizeOfFile(lpFile);

  lpResult = (char*)malloc(nFileSize + 1);
  if (! lpResult)
    goto the_end;

  if (fread(lpResult, 1, nFileSize, lpFile) != nFileSize)
  {
    free(lpResult);
    lpResult = NULL;
  }
  lpResult[nFileSize] = 0;

the_end:
  return lpResult;
}

char** LoadLines(FILE* lpFile, int* nLineCount, char** lpBuffer)
{
  char** lpResult;
  int nI, nJ;

  lpResult = NULL;
  
  *lpBuffer = LoadFile(lpFile);
  if (! *lpBuffer)
    goto the_end;

  /* On compte le nombre de ligne */
  nI = 0;
  *nLineCount = 1;
  while ((*lpBuffer)[nI])
  {
    if ((*lpBuffer)[nI] == '\n')
      (*nLineCount)++;
    nI++;
  }

  /* On alloue un tableau de pointeur sur les lignes */
  lpResult = (char**)malloc(*nLineCount * sizeof(char*));
  if (! lpResult)
  {
    free(*lpBuffer);
    goto the_end;
  }

  /* On fait pointer les cases du tableau sur les lignes */
  nI = 0;
  for (nJ = 0; nJ < *nLineCount; nJ++)
  {
    lpResult[nJ] = &(*lpBuffer)[nI];
    while (((*lpBuffer)[nI]) && ((*lpBuffer)[nI] != '\n'))
    {
      if ((*lpBuffer)[nI] == '\r')
        (*lpBuffer)[nI] = 0;
      nI++;
    }
    (*lpBuffer)[nI] = 0;
    nI++;
  }

the_end:
  return lpResult;
}

int main()
{
  FILE* lpInputFile;
  char** lpLines;
  char* lpBuffer;
  int nLineCount;
  int nResult;
  int nI;

  nResult = 1;

  if (! SafeOpenFile("input.txt", "rb", &lpInputFile))
    goto the_end;

  lpLines = LoadLines(lpInputFile, &nLineCount, &lpBuffer);
  if (! lpLines)
  {
    printf("Echec du chargement du fichier\n");
    goto close_input_file;
  }
 
  puts("===================");
  for (nI = 0; nI < nLineCount; nI++)
    puts(lpLines[nI]);
  puts("===================");

  nResult = 0;

  free(lpBuffer);
  free(lpLines);
close_input_file:
  fclose(lpInputFile);
the_end:
  return nResult;
}



Mais bon, dans ton cas, il est probablement plus simple de travailler directement sur le fichier chargé en mémoire et de traiter les \n comme des caractères séparateurs, de cette manière :

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

FILE *SafeOpenFile(char *lpFileName, char *lpMode, FILE **lpFile)
{
  *lpFile = fopen(lpFileName, lpMode);

  if (! *lpFile)
    printf("Cannot open file: "%s"\n", lpFileName);

  return *lpFile;
}

long GetSizeOfFile(FILE* lpFile)
{
  long nCurrentPos;
  long nResult;

  nCurrentPos = ftell(lpFile);

  fseek(lpFile, 0, SEEK_END);
  nResult = ftell(lpFile);

  fseek(lpFile, nCurrentPos, SEEK_SET);

  return nResult;
}

char* LoadFile(FILE* lpFile)
{
  long nFileSize;
  char* lpResult;

  nFileSize = GetSizeOfFile(lpFile);

  lpResult = (char*)malloc(nFileSize + 1);
  if (! lpResult)
    goto the_end;

  if (fread(lpResult, 1, nFileSize, lpFile) != nFileSize)
  {
    free(lpResult);
    lpResult = NULL;
  }
  lpResult[nFileSize] = 0;

the_end:
  return lpResult;
}

int main()
{
  FILE* lpInputFile;
  char* lpLines;
  char lpWord[200];
  int nResult;
  int nJ;
  int nI;

  nResult = 1;

  if (! SafeOpenFile("input.txt", "rb", &lpInputFile))
    goto the_end;

  lpLines = LoadFile(lpInputFile);
  if (! lpLines)
  {
    printf("Echec du chargement du fichier\n");
    goto close_input_file;
  }

  puts("===================");
  nI = 0;
  nJ = 0;
  while (1)
  {
    if ((! lpLines[nI]) || (lpLines[nI] == '\n')) 
    {
      memcpy(lpWord, &lpLines[nJ], nI - nJ);
      lpWord[nI - nJ] = 0;
      nJ = nI + 1;
      puts(lpWord);
      if (! lpLines[nI])
        break;
    }
    if (lpLines[nI] == '\r')
      lpLines[nI] = 0;
    nI++;
  }
  puts("===================");

  nResult = 0;

  free(lpLines);
close_input_file:
  fclose(lpInputFile);
the_end:
  return nResult;
}
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Ou moins performant mais moins de code, tu peux utiliser fgets.

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

FILE *SafeOpenFile(char *lpFileName, char *lpMode, FILE **lpFile)
{
  *lpFile = fopen(lpFileName, lpMode);

  if (! *lpFile)
    printf("Cannot open file: "%s"\n", lpFileName);

  return *lpFile;
}

int main()
{
  FILE* lpInputFile;
  char lpWord[200];
  int nResult;
  int nI;

  nResult = 1;

  if (! SafeOpenFile("input.txt", "rb", &lpInputFile))
    goto the_end;

  puts("===================");
  while (fgets(lpWord, 200, lpInputFile))
  {
    nI = 0;
    while(lpWord[nI])
    {
      if ((lpWord[nI] == '\n') || (lpWord[nI] == '\r'))
        lpWord[nI] = 0;
      nI++;
    }
    puts(lpWord);
  }
  puts("===================");

  nResult = 0;

  fclose(lpInputFile);
the_end:
  return nResult;
}