La fonction: char* GetLineFromBuf(char* lpBuf, int iLine, int iNbLines) { // Vérifie les paramètres if(!lpBuf || (iLine < 0) || (iLine >= iNbLines)) return NULL; // Mauvais paramètres while(iLine--) lpBuf += strlen(lpBuf) + 1; return lpBuf; } Le code: HANDLE hSrcFile = INVALID_HANDLE_VALUE; char* lpData = NULL; char* lpWork = NULL; DWORD dwFileSize = 0; int nLines = 0; DWORD dwR; int i; // Ouverrure du fichier hSrcFile = ::CreateFile("C:\\export.xml", GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); // Vérifier l'ouverture if(hSrcFile == INVALID_HANDLE_VALUE) { // Erreur d'ouverture printf("Erreur d'ouverture du fichier!\n"); // Sortir return 0; } // Récupérer la taille if((dwFileSize ::GetFileSize(hSrcFile, NULL)) (DWORD)-1) { // Erreur de taille printf("Erreur sur la taille du fichier!\n"); // Fermer le fichier ::CloseHandle(hSrcFile); hSrcFile = INVALID_HANDLE_VALUE; // Sortir return 0; } // Allouer un buffer (taille + 1 pour null char) if((lpData (char*)malloc(dwFileSize + 1)) NULL) { // Erreur printf("Erreur d'allocation!\n"); // Fermer le fichier ::CloseHandle(hSrcFile); hSrcFile = INVALID_HANDLE_VALUE; // Sortir return 0; } // Lire le fichier au complet if(!::ReadFile(hSrcFile, lpData, dwFileSize, &dwR, NULL)) { // Erreur de lecture printf("Erreur de lecture!\n"); // Désalouer le buffer free(lpData); lpData = NULL; // Fermer le fichier ::CloseHandle(hSrcFile); hSrcFile = INVALID_HANDLE_VALUE; // Sortir return 0; } // Fermer le fichier ::CloseHandle(hSrcFile); hSrcFile = NULL; // S'assurer que le dernier byte est un null char *(lpData + dwFileSize) = '\0'; // Convertir chaque retour de ligne en null char // Comme ça on a une suite de lignes dans le buffer // Attention: Il faut en même temps les compter pour // ne pas aller chercher une ligne inexistante par la suite // Du même coup, on supprime les \r qui peuvent être gênants lpWork = lpData; nLines = (*lpWork ? 1 : 0); while(*lpWork) { switch(*lpWork) { case '\r': // Un caractère non voulu. On le supprime memmove(lpWork, lpWork + 1, strlen(lpWork + 1) + 1); // On reste à cette place break; case '\n': // Un retour de ligne. On le convertit en null char *lpWork = '\0'; //On passe à la suite lpWork++; // Une nouvelle ligne nLines++; break; default: // Un caractère, on le passe lpWork++; break; } } // Plus besoin de ça lpWork = NULL; // Maintenant on fait ce qu'on veut printf("Il y a %u lignes dans ce fichier. Les lignes sont :\n", nLines); for(i = 0; i < nLines; i++) { printf("Ligne %02u : %s\n", i + 1, GetLineFromBuf(lpData, i, nLines)); } // Désalouer le buffer! free(lpData); lpData = NULL;
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question//Création du buffer pour lire le fichier source dwFileSize = GetFileSize(hSrcFile,NULL) + 1; szData = new char[dwFileSize]; //Lire le fichier source if(!ReadFile(hSrcFile,szData,dwFileSize,&dwO,0)) { delete[] szSrc; delete[] szData; CloseHandle(hSrcFile); CloseHandle(hDestFile); return FALSE; }
char *c, *d, *pout; DWORD dw;
dwFileSize = GetFileSize(hSrcFile,NULL); szData = new char[dwFileSize + 1];
d = 0; ReadFile(hSrcFile,szData,dwFileSize,&dw,0); CloseHandle(hSrcFile);
if(dw != dwFileSize) ALORS MAUVAISE LECTURE, NETTOIE ET SORS.
dwFileSize = GetFileSize(hSrcFile,NULL) + 1; szData = new char[dwFileSize+1]; //Lire le fichier source if(!ReadFile(hSrcFile,szData,dwFileSize,&dw,0)) { delete[] szSrc; delete[] szData; CloseHandle(hSrcFile); CloseHandle(hDestFile); return FALSE; } CloseHandle(hSrcFile);
d = szData; pout = szData + dwFileSize;