#include <stdio.h> #include <stdlib.h> /** * Renvoie le nombre de colonnes dans la première ligne * * Les colonnes sont séparées par des espaces. Il peut y avoir des * espaces avant et après les colonnes. Le nombre d'espaces n'a pas * d'importance. Ne gère pas les tabulations. */ int CountColumns(FILE* lpFile) { int nChar; long nPreviousPos; int bTokenFound; int nResult; nResult = 0; bTokenFound = 0; nPreviousPos = ftell(lpFile); do { nChar = fgetc(lpFile); if (nChar == ' ') { if (bTokenFound) { nResult++; bTokenFound = 0; } } else if ((nChar != EOF) && (nChar != '\n')) bTokenFound = 1; } while ((nChar != EOF) && (nChar != '\n')); if (bTokenFound) nResult++; fseek(lpFile, nPreviousPos, SEEK_SET); return nResult; } /** * Compte le nombre de lignes d'un fichier * * Ne compte pas l'éventuelle ligne vide en fin de fichier. */ int CountLines(FILE* lpFile) { int nChar; long nPreviousPos; int nPreviousChar; int nResult; nResult = 0; nChar = -1; nPreviousPos = ftell(lpFile); do { nPreviousChar = nChar; nChar = fgetc(lpFile); if (nChar == '\n') nResult++; } while (nChar != EOF); if ((nPreviousChar != '\n') && (nPreviousChar != -1)) nResult++; fseek(lpFile, nPreviousPos, SEEK_SET); return nResult; } /** * Alloue une matrice de la dimension spécifiée */ int **AllocMatrix(int nLines, int nColumns) { int** lpResult; char* lpColumnsOffset; int nI; lpResult = (int**)malloc(nLines * sizeof(int*) + nLines * nColumns * sizeof(int)); lpColumnsOffset = (char*)lpResult + nLines * sizeof(int*); for (nI = 0; nI < nLines; nI++) lpResult[nI] = (int*)(lpColumnsOffset + nI * nColumns * sizeof(int)); return lpResult; } /** * Charge la matrice dans le fichier dans la matrice en mémoire */ void LoadMatrix(FILE* lpFile, int **lpMatrix, int nLines, int nColumns) { int nI, nJ; for (nI = 0; nI < nLines; nI++) for (nJ = 0; nJ < nColumns; nJ++) fscanf(lpFile, "%d", &lpMatrix[nI][nJ]); } /** * Affiche la matrice */ void DisplayMatrix(int **lpMatrix, int nLines, int nColumns) { int nI, nJ; for (nI = 0; nI < nLines; nI++) { for (nJ = 0; nJ < nColumns; nJ++) printf("%d ", lpMatrix[nI][nJ]); printf("\n"); } } int main() { int** lpMatrix; int nColumns; int nLines; FILE* lpFile; int nResult; lpFile = fopen("test.txt", "r"); if (! lpFile) { printf("Impossible d'ouvrir le fichier\n"); nResult = 1; } else { nColumns = CountColumns(lpFile); nLines = CountLines(lpFile); printf("Nombre de colonnes : %d\n", nColumns); printf("Nombre de lignes : %d\n", nLines); lpMatrix = AllocMatrix(nLines, nColumns); LoadMatrix(lpFile, lpMatrix, nLines, nColumns); DisplayMatrix(lpMatrix, nLines, nColumns); free(lpMatrix); fclose(lpFile); nResult = 0; } return nResult; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question