Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : std::string Buffer = ""; [ Divers / Général ] (yanlou)

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é 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

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.