begin process at 2012 02 12 17:18:45
  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

Membre Club
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

Membre Club
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

Membre Club
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 HELP - - getline string char conversion de types?? [ par gregroar ] //je teste dans une console la fonction getline, que je trouve suffisament rapide. //cependant je me retrouve confronté à des problemes de conversion Comparaison de string ligne par ligne pour supprimer les doublons [ par Flash11 ] Bonjour, je suis nouveau et débutant dans les langages de programmation. J'espère que vous pourrez m'aider à résoudre mon problème et je remercie d'a problème dans l'affichage dans un fichier [ par mervat ] bonjour, j'ai écrit la fonction ci-dessous qui calcule [url=http://fr.wikipedia.org/wiki/TF-IDF]tfidf[/url] mon programme est bien exécutable et donn Lecture de ligne dans un fichier texte sous windows et unix [ par moumouteb ] Bonjour, Je développe un code qui doit tourner sous Windows et UNIX. J'utilise la fonction getline() pour lire un fichier texte. Et bien sûr suivant POLA principe en C [ par erkan1404 ] Bonjour, J'effectue un petit programme qui réalise une implémentation du principe POLA pour ce qui concerne les accès à des fichiers. Par défaut, un lire chaîne ligne par ligne [ par mervat ] bonjour, je veux lire une chaîne (std::string) ligne par ligne, j'ai pas pu le faire avec std::getline car ça marche avec les fichiers (std::ifstream) [Programme en C] Gestion d'un fichier texte dans un programme en C [ par Azshari ] Bonjour à tous Mon problème est le suivant, j'ai un fichier .FIL que j'aimerai exploiter. Voila ce qu'on peut trouver dans ce fichier lorsqu'on l'o


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 9,344 sec (3)

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