begin process at 2012 05 29 12:02:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

fstream, >> et <<


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

fstream, >> et <<

jeudi 20 septembre 2007 à 14:59:50 | fstream, >> et <<

Roro8883

Bonjour à tous !

J'ai un problème dans mon code avec la fonction fstream.
Ca fait depuis un moment que je suis dessus et je trouve pas le problème.
Si quelqu'un pouvait m'aider ....


   fstream hfile;                           

   hfile.open(file.c_str(), ios::in | ios::out);
     
         /* Modification  */
      // Lecture du fichier jusqu'à la la ligne précédent la ligne recherchée
   int x = 0;
   while ((!hfile.eof()) && (x != meter))
   {
      hfile >> line;
      x++;
   }

      // Modification
   hfile << value << "\n";

         /* Fermeture du fichier */
   hfile.close();


Voilà mon code, et le problème est que les lignes sont bien lues dans le fichier, mais impossible d'y écrire quelque chose !
Je pense que c'est parce que je mets les >> et << à la suite, mais je vois pas pourquoi ça poserait problème.

Qi quelqu'un pouvait m'aider ... parce que ça fait à peu près 2H que je suis dessus !

Merci
jeudi 20 septembre 2007 à 16:26:31 | Re : fstream, >> et <<

The_Guardian

Bonjour,

Je ne suis pas sure que l'ecriture dans un fichier soit aussi facile et je serais toi, j'ouvrirais le fichier A en lecture et je creerais un fichier B en ecriture et ensuite toutes les lignes lues de A sont recopiees dans B sauf la ligne que tu veux changer
 et apres tu ecris jusqu'a la fin et tu renommes B en A et c'est ok
car je vois pas trop comment ca va faire si l'ancienne ligne L1 est remplacee par une nouvelle ligne L2 plus longue
mais bon peut-etre que fstream gere tout ca tout seul deja  mais ca me parait assez etrange enfin voila ce que je te propose de faire
===




Une autruche ne se cuit pas aux petits lardons
jeudi 20 septembre 2007 à 17:19:45 | Re : fstream, >> et <<

Roro8883

Ben on voit sur plein de site qu'on peut ouvrir un fichier texte en lecture et écriture simultanément avec fstream ...
Donc j'ai tenté, mais ça marche pas !
J'sais pas pourquoi...

J'ai presque réussi en utilisant :
    long place = hfile.tellg();
    hfile.seekp (place-1);
mais ça ne fonctionne que pour des chaines de mêmes taille (et encore ...).


Donc je pense que je vais faire comme tu dis.
J'voulais faire un truc plus simple, mais en fait ça marche pas (j'vois pas à quoi ça sert alors fstream !).

Tant pis, merci quand même !
jeudi 20 septembre 2007 à 17:59:43 | fstream, >> et << et modification

Roro8883

Le problème c'est que souvent le fichier contient plein de données (pleins de lignes de texte).

Et donc lire et recopié entièrement le fichier prend pas mal de temps ... ce que je voudrais absolument éviter !

Existe-t-il un moyen (facile ou non [enfin pas super dur non plus]) pour modifier une ligne de texte dans un fichier sans avoir besoin de la recopier ?!

jeudi 20 septembre 2007 à 19:13:44 | Re : fstream, >> et <<

SAKingdom

Membre Club
Comment veux tu te positionner à la ligne voulu si tu ne le lis pas en entier ?
On peut éviter de recopier ce qui précède la ligne mais pas se qui suit (si les tailles ne sont pas identique).

Voici un exemple vite fait:

int main(void)
{
    char *lpBuf;
    char lpNewLine[] = "Ceci est une ligne de remplacement\r\n";
    int iSize;
    fstream fsFile("d:\\test.txt", ios::in|ios::out|ios::binary);

    fsFile.seekg(0, ios::end);
    iSize = fsFile.tellg();
    fsFile.seekg(0, ios::beg);

    lpBuf = new char[iSize+1];

    fsFile.read(lpBuf, iSize);
    lpBuf[fsFile.gcount()] = 0;

    int iLast = 0, iCur = 0;
    int iLine = 5; // On remplace la 5 ème ligne

    do {
        if(lpBuf[iCur] == '\n' || !lpBuf[iCur]) {
            if(!--iLine) {
                fsFile.seekg(iLast, ios::beg);
                fsFile.write(lpNewLine, sizeof(lpNewLine)-1);
                if((iCur-iLast)+1 != sizeof(lpNewLine)-1)
                    fsFile.write(&lpBuf[++iCur], (iSize-iCur));
                break;
            }
            iLast = iCur+1;
        }
    } while(lpBuf[iCur++]);

    delete[] lpBuf;
               

    return 0;
}

C++ (@++)

jeudi 20 septembre 2007 à 20:51:19 | Re : fstream, >> et <<

Roro8883

Oui, avant d'appeller le code que j'ai mis dans mon premier post, je lis d'abord le fichier (presque en entier) pour enregistrer le numéro de la ligne à modifier (dans la variable 'meter').

Et sinon, le vrai problème c'est que les fichiers sont trop gros.
Rien que cette ligne :
    lpBuf = new char[iSize+1];
J'imagine même pas la quantité de mémoire que ça utiliserait, même si après la mémoire est libérée...

Enfin, si je comprends bien, y'a aucune fonction, classe ou autre chose qui permette de modifier le texte (d'un fichier texte) comme on ferait simplement en l'ouvrant avec un éditeur de texte ?!
jeudi 20 septembre 2007 à 21:04:19 | Re : fstream, >> et <<

SAKingdom

Membre Club
Un éditeur de texte met tout le fichier en mémoire (ou une partie, dépendant de l'éditeur). Les modifications sont faites en mémoire et réintégrées dans le fichier à la fin.

Si ton fichier est vraiment trop gros, il faudra le charger en mémoire par bloques.
Sinon, j'aimerais bien savoir qu'elle taille a ce fichier, car un fichier texte n'est, normalement, pas supposé être si gros.

C++ (@++)

jeudi 20 septembre 2007 à 21:15:06 | Re : fstream, >> et <<

Roro8883

C'est pas vraiment un fichier texte ... enfin si mais c'est plus présenté comme une base de données.

C'est un fichier qui contient des séquences d'ADN, et pleins d'autres trucs du genre.
Donc ça prend de la place !

Sinon, les logiciels de base de données, ils font comment, ça fonctionne pareil que les éditeur de texte (mise en mémoire par bloc) ?
jeudi 20 septembre 2007 à 21:36:49 | Re : fstream, >> et <<

SAKingdom

Membre Club
J'ignore comment sont conçu les BDD mais ça m'étonnerais énormément.

C++ (@++)

samedi 22 septembre 2007 à 12:09:33 | Re : fstream, >> et <<

luhtor

Ca prend énormément de place surtout si tu utilises un fichier au format texte. Un fichier binaire te fera économiser énormément de place (4 fois moins de mémoire), et c'est tellement plus rapide en lecture et tellement plus simple à manipuler par programme. Evidemment c'est illisible avec un éditeur de texte.

Avec un format binaire, tu te positionnes à l'emplacement ou tu veux écrire des données. Toutes les données restantes dans le fichier doivent être décalé pour pouvoir y intercaler tes données. L'intérêt c'est que ce décalage peut s'effectuer par bloc (comme on ferait pour un fichier texte), et donc meme si ton fichier est énorme, tu peux simplement décaler par bloc de quelques dizaines de ko.

1 2

Cette discussion est classée dans : fichier, problème, code, hfile, fstream


Répondre à ce message

Sujets en rapport avec ce message

Pb de gestion de fichier avec fstream [ par Bub325 ] Salut,J'ai deux problème distinct avec fstream, Le premier est que lorsque j'arrive à la fin d'un fichier, je ne peut plus revenir plus haut dans ce d Problème : Récupération des données d'un Buffer pour mettre dans une EditBox [ par Memerosti ] BonjourMon problème est le suivant : J'ai ouvert un fichier, lu ses données, et jusque là ça va. Mais ensuite je voudrais récupérer ces données, pour fstream [ par Mcjo ] Bonjour, me rémettant depuis peu au c++ j'ai testé un code de lecture dans un fichier mais la fonction bad() ne semble pas fonctionnée correctement. extraire une chaine d'un fichier avec fstream [ par graall ] bonjour,j'ai un problème avec ce code :(le problème est explique dans les comentaires)int x = 10; fstream file("fichier.txt, ios_base::in); char *begi Corrigez mon code? Comment récupérer la taille d'un fichier? [ par supergrey ] Bonjour j'utilise pour l'instant la fonction suivante pour récupérer la taille d'un fichier: DWORD TailleFichier(char* str_NomFichier){     HANDLE hFi Problème en C++ [ par Farqual ] Bonjour, je viens de me lancer dans le cpp mais j'ai un problème au niveau de la compilation d'un fichier source en un .exe j'apprend avec un livre et Problème de résultats differents lors de l'exécution d'un meme code sur deux machines [ par miacara ] Bonjour tous le monde, J'ai un problème un peu bizarre, et j'ai besoin de vos recommandations et clarifications, Je possède un codeur programé en C ( Problème de fichier en C [ par kiitos ] Je cherche à créer un fichier qui s'ouvre lui même sans qu'il puisse dépendre de son propre nom. Est ce que c'est possible ?FILE *fichier;fichier = fo problème fichier texte (ofstream) taille ? [ par baby3378 ] Bonjour à tous, voila, j'ai repri il y a quelque temps la base d'une source qui listait tous les fichiers d'un repertoire. Jusque là aucun souci. Cep Problème écriture fichier [ par pitidragon ] Bonjour à tous !J'ai besoin d'aide pour finaliser un projet pour la fac. Je dois réaliser un démineur, et j'ai un petit soucis pour finir. Je dois gér


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



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

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