begin process at 2010 03 12 15:53:47
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

std::string Buffer = "";


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

std::string Buffer = "";

vendredi 11 juillet 2008 à 16:19:49 | std::string Buffer = "";

yanlou

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
vendredi 11 juillet 2008 à 17:26:05 | Re : std::string Buffer = "";

laurent1024

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.
vendredi 11 juillet 2008 à 17:27:08 | Re : std::string Buffer = "";

luhtor

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.
vendredi 11 juillet 2008 à 17:58:24 | Re : std::string Buffer = "";

yanlou

je reçoi une erreur undeclared Line_to_Erase_Begin
maximus
vendredi 11 juillet 2008 à 18:24:12 | Re : std::string Buffer = "";

Neo_Fr

Membre Club
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
jeudi 17 juillet 2008 à 12:08:14 | Re : std::string Buffer = "";

yanlou

avec ce code j'obtie 22 erreur !!!

maximus
jeudi 17 juillet 2008 à 12:12:34 | Re : std::string Buffer = "";

laurent1024

Sans doute parce que tu n'as pas repris complètement la source. Il manque sans doute des includes.
Cdt
jeudi 17 juillet 2008 à 12:18:45 | Re : std::string Buffer = "";

yanlou

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

maximus
jeudi 17 juillet 2008 à 12:21:38 | Re : std::string Buffer = "";

laurent1024

Si tu ne donnes pas les erreurs, nous n'allons pas les devinez.
Cdt


Cette discussion est classée dans : fichier, ligne, std, line, erase


Répondre à ce message

Sujets en rapport avec ce message

Lire un fichier texte ligne par ligne et copier les éléments dans une combo!!! [ par freepouy18 ] Salut à tous, j'ai un problème avec la copie de données provenant d'un fichier texte dans une combo. Voila mon code : std::ifstream fichier( "monfichi modifier la ligne N [ par Rhazou ] bonjour, J'ai un petit probleme concernant les flux entré/sortie. j'aimerais replacer un ligne par une autre dasn un fichier. je cherche depusi un mom Probleme boucles Fstream comparaison [ par nerone21 ] Bonsoir a vous les serials codeurs, alors j'aurais besoin de vos lumiere car j'ai un petit gros probleme que je ne comprend pas.voici mon code en dess MFC lire un fichier texte ligne par ligne [ par mqsi ] salut a tous,vs pouvez me dire comment lire un fichier texte ligne par ligne,puis recuperer chaque ligne ds un tableau,et merci pr l'aide,je travail a lecture fichier et test des lignes... [ par jojomillenium ] Bonjour, J'aimerai lire un fichier qui ressemble a ca: KJ  1 3 5; I  OPL; B 12 34 78, 90; I  PPL; et ainsi de suite des lignes qui ne sont pas du meme [Langage C] Obtenir une ligne d'un fichier (scanf%[^X]) [ par Thranduil ] Bonjour, j'essaie de créer une fonction qui doit lire une ligne entière d'un fichier texte (donc jusqu'au '\n' mais ça ne marche pas. (C'est la même q Fichier TXT dans textbox [ par nerone21 ] Bonjour a tt les codeurs...Lors voila mon probleme, je code avec visual C++ 2005 express et quel fut mon desarroi lorsque je me suis appercu ke nos ch détection d'un mot dans un fichier [ par stan000 ] Bonjour,J'aurais besoin d'aide pour réaliser un programme ou pour connaitre la démarche à suivre.J'ai un fichier texte contenant plusieurs lignes dont message d'erreur [ par mqsi ] bjr a tous;j'ai un petit probleme : j'ai un programme qui lire un fichier text ligne par ligne quand le fichier contient plusieur ligne( equivalent  3 lire un fichier texte avec visual C++ [ par sarah62223 ] Bonjour,Je suis actuellement en train de developper en C++ et je voudrais savoir comment faire pour venir lire dans un fichier texte ligne par ligne ,


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,014 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales