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;
}