Std::string Buffer = "";

Signaler
Messages postés
119
Date d'inscription
dimanche 30 septembre 2007
Statut
Membre
Dernière intervention
11 août 2010
-
cs_laurent1024
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
-
salut
j'ai un fichier .csv qui contient 27000 ligne et je veux suprrimer les ligne 4,5,6
ça fonction avec le code que j'ai mais ça prend presque 2min pour s'exécuté
y'a t'il unmoyenne pour minimiser le temps de l'execution 

#include <string>
#include <fstream>
 
void Erase_Line1(char* z, int Line_to_Erase)
{
    std::string Buffer = ""; //Variable contenant le texte à réécrire dans le fichier
    std::ifstream ReadFile( z);
    if (ReadFile) //Si le fichier est trouvé
    {
        std::string line;
        int Line = 0;
        while ( std::getline( ReadFile, line ) ) //on parcours le fichier et on initialise line à la ligne actuelle
        {
            Line++;
            if(Line != Line_to_Erase) //Si la ligne atteinte est différente de la ligne à supprimer...
                Buffer += line + "\n"; //On ajoute le contenu de la ligne dans le contenu à réécrire
        }
    }
    ReadFile.close(); //On ferme le fichier en lecture
 
    std::ofstream WriteFile( z); //On ouvre ce même fichier en écriture
    WriteFile << Buffer; //On écris le texte dedans
    WriteFile.close(); //et on ferme le fichier
}
 
int main()

   Erase_Line1("z.txt", 4);
 Erase_Line1("z.txt", 4);
 Erase_Line1("z.txt", 4);
   
 return 0;
}

maximus

8 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
14
Faut changer la fonction, là tu va lire et écrire 3 fois un gros fichiers.
Il faut faire une fonction qui puisse supprimer plusieurs ligne consécutivement :
void Erase_Line1(char* z, int Line_to_Erase_Begin; int length)
if(Line < Line_to_Erase || Line >= (Line_to_Erase+length))
 Erase_Line1("z.txt", 4, 3);

Ce que tu peux essayer aussi c'est de créer un deuxième fichier de sortie et au lieu d'utiliser un buffer tu écris au fur et à mesure dans ce deuxième fichier.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Bas au lieu de supprimer 3 fois 1 ligne, il vaut bcp mieux supprimer 1 fois 3 lignes. Donc changes ta fonction pour qu'elle supprime toutes les lignes d'un coup en prenant par exemple un tableau en argument.
Messages postés
119
Date d'inscription
dimanche 30 septembre 2007
Statut
Membre
Dernière intervention
11 août 2010

je reçoi une erreur undeclared Line_to_Erase_Begin
maximus
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Si tu veut que se soit vraiment rapide, oublie les string, ofstream and co..;
utilise directement les apis..

Je t'ai fait une fonction, pour l'utiliser tu devras te procurer ReadLine.c et ReadLine.h ici: http://www.cppfrance.com/codes/WIN32-LIRE-FICHIER-LIGNE-LIGNE_44453.aspx

Voici la fonction change szInFile et szOutFile par les chemins appropriés..
tu peut changer les valeur de dwTab[] pour effacer les lignes que tu veux..

DWORD __stdcall GetNumberOfLine(LPSTR lpszFilePath)
{
HANDLE hFile;
DWORD dwLines = 0, dwByteRead, i;
BYTE* lpData;
lpData = (BYTE*) HeapAlloc(GetProcessHeap(), 0, 0x100000);
if(!lpData) return 0;
hFile = CreateFile(lpszFilePath, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) return 0;
while(1)
{
if(!ReadFile(hFile, lpData, 0x100000, &dwByteRead, 0)) goto _Error;
if(!dwByteRead) break;
i = dwByteRead;
do
{
if(lpData[i] == 0x0D) dwLines++;
}while(i--);
}
_Error:
HeapFree(GetProcessHeap(), 0, lpData);
CloseHandle(hFile);
return dwLines;
}


DWORD __stdcall EraseLines(LPSTR lpszInFile, LPSTR lpszOutFile, LPDWORD lpdwLinesTab, DWORD nbLines)
{
const DWORD dwMaxLineSize = 4096;
LPOPENL lpoLine;
HANDLE hFile;
DWORD dwLinesErased 0, dwLines 1, dwLinesLeft, dwLineLen, bw, i;
BOOL bWrite;
BYTE* lpBuff;
lpBuff = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, dwMaxLineSize);
if(!lpBuff) goto _Error;
dwLinesLeft = GetNumberOfLine(lpszInFile);
if(!dwLinesLeft) goto _Error;
lpoLine = OpenLine(lpszInFile, GetTypeOfFile(lpszInFile));
if(!lpoLine) return 0;
hFile = CreateFile(lpszOutFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) goto _Error;
do
{
dwLineLen = ReadLine(lpoLine, dwLines, lpBuff);
if(!dwLineLen) goto _Error;
*((WORD*) &lpBuff[dwLineLen]) = '\r\n'; dwLineLen+=2;
i = nbLines;
bWrite = TRUE;
do
{
if(dwLines lpdwLinesTab[i]) bWrite FALSE;
}while(i--);
if(bWrite) { if(!WriteFile(hFile, lpBuff, dwLineLen, &bw, 0)) goto _Error; }
else dwLinesErased++;
dwLines++;
}while(dwLinesLeft--);
_Error:
if(hFile) CloseHandle(hFile);
if(lpoLine) CloseLine(lpoLine);
HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpBuff);
return dwLinesErased;
}

int main(void)
{
DWORD dwLinesErased;
char szInFile[] = "C:\\ton_fichier_originale.txt";
char szOutFile[] = "C:\\ton_fichier_de_sortie.txt";
DWORD dwTab[6] = { 3, 5, 8, 16, 18, 32 };
dwLinesErased = EraseLines(szInFile, szOutFile, dwTab, (sizeof(dwTab)/sizeof(DWORD)));
printf("%i lignes effacées...\n", dwLinesErased);
system("PAUSE");
return 0;
}

Neo_Fr
Messages postés
119
Date d'inscription
dimanche 30 septembre 2007
Statut
Membre
Dernière intervention
11 août 2010

avec ce code j'obtie 22 erreur !!!

maximus
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
14
Sans doute parce que tu n'as pas repris complètement la source. Il manque sans doute des includes.
Cdt
Messages postés
119
Date d'inscription
dimanche 30 septembre 2007
Statut
Membre
Dernière intervention
11 août 2010

non, j'ai tous repris mais il me donne tjr ces erreur !!

maximus
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
14
Si tu ne donnes pas les erreurs, nous n'allons pas les devinez.
Cdt