Fichier texte et comparaison

olobo Messages postés 40 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 17 mars 2010 - 3 janv. 2010 à 19:23
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 4 janv. 2010 à 17:32
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

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
4 janv. 2010 à 17:24
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;
}
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
4 janv. 2010 à 17:32
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;
}
0
Rejoignez-nous