begin process at 2008 07 06 12:55:36
1 205 544 membres
121 nouveaux aujourd'hui
14 119 membres club

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 !

[STL] CONNAITRE LA TAILLE D'UN FICHIER ET COPIER DANS UN STRING


Information sur la source

Catégorie :Fichiers / Disque Niveau : Débutant Date de création : 08/06/2005 Vu : 12 484

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note

Description

2 méthodes pour copier le contenu d'un fichier dans un string.
1 méthode directe pour connaitre la taille d'un fichier.

Savoir la taille d'un fichier: il suffit d'utiliser seekg et de placer le pointeur en fin de fichier (avec l'aide de ios::end), puis d'utiliser tellg qui renvoie l'offset depuis le début de fichier jusqu'à la position courante. Penser à remettre le pointeur en début de fichier. On peut aussi sauvegarder la position courante, calculer la taille de fichier restante, puis remettre le pointeur dans l'ancienne position.

Pour la copie du contenu dans un string, on crée un buffer (char*) de taille du fichier, on utilise read, et la méthode assign des string. C'est assdez bourrin. Une autre méthode (la une) utilise assign avec en premier paramètre un iterateur du fichier de type char (les éléments référencés par l'iterateur sont des char) et en second paramètre un iterateur de char vide (correspondant à une fin de lecture). L'inconvénient est que cela reproduit le systèùme suivant:
while (fichier >> toto) // char toto
   res.pushback(toto);
donc les caractères séparateurs seront ignorés.

Source

  • int main (int argc, char** argv)
  • {
  • ifstream fichier("buf.txt",ios::binary);
  • string res;
  • // METHODE 1:
  • // res.assign(istream_iterator<char>(fichier), istream_iterator<char>() );
  • // METHODE 2:
  • int size; char *buffer;
  • // taille du fichier
  • fichier.seekg(0,ios_base::end);
  • size= fichier.tellg();
  • fichier.seekg(0,ios_base::beg);
  • // copie dans string
  • buffer= new char[size];
  • fichier.read(buffer,size);
  • res.assign(buffer,size);
  • cout << "size= " << size << endl << "res------------\n" << res << "res------------" << endl;
  • getch();
  • }
int main (int argc, char**	argv)
{
	ifstream fichier("buf.txt",ios::binary);
	string res;

//	METHODE 1:
//	res.assign(istream_iterator<char>(fichier), istream_iterator<char>() );
	
//	METHODE 2:
	int size;	char *buffer;

	// taille du fichier
	fichier.seekg(0,ios_base::end);
	size= fichier.tellg();
	fichier.seekg(0,ios_base::beg);

	// copie dans string
	buffer= new char[size];
	fichier.read(buffer,size);
	res.assign(buffer,size);

	cout << "size= " << size << endl << "res------------\n" << res << "res------------" << endl;

	getch();
}

Conclusion

Ca peut paraitre compliqué qd on connait pas la STL, mais cette bibliothèque pense vraiment à tout. Toutefois, si vous avez des prob sur ce mini-source, demandez moi.
  • signaler à un administrateur
    Commentaire de MuPuF le 08/06/2005 14:53:14

    je fais pareil mais en c, les fichiers en c++ j'ai jamais tenté, j'ai une classe sauvegarde a la ini qui foire un peu lors de la création d'une clée, je vais voir si l'utiliser ne resoudrais pas mon probleme, avec un peu de chance, je vous la posterais car elle est plus sympa a utiliser que le ini de windows qui ne permet meme pas d'écrire direct un integer ...

  • signaler à un administrateur
    Commentaire de magic_Nono le 08/06/2005 16:34:07

    Mupuf > cf BFichierIni ds mes publications
    TeLeTUbIz> cf BFichier

    idem;

    dans les bxxx:
    http://steph.dall.online.fr/MP
    ++

  • signaler à un administrateur
    Commentaire de magic_Nono le 08/06/2005 16:34:40

    C ANSI ou C++

  • signaler à un administrateur
    Commentaire de MuPuF le 08/06/2005 16:47:57

    Lol, pas mal, mais moi je travaille avec des char* (tu vois pourquoi c'est un peu plus chiant lol). String.h, je veux bien mais la je veux TOUT controler (comme cortex). Donc je fini ça et je serais content ;-)

  • signaler à un administrateur
    Commentaire de TeLeTUbIz le 08/06/2005 17:04:13

    Magic_Nono --> oui, mais l'avantage des strings, c'est qu'ils sont standard :)
    Donc on l'utilise bcp, et on se pose souvent la question pour trouver la taille d'un fichier.

  • signaler à un administrateur
    Commentaire de vecchio56 le 08/06/2005 17:05:53 administrateur CS

    STL pense a tout, mais pas toi. Tu dois vérifier que l'allocation new a bien réussit (imagine un fichier de plusieurs GO et peu de mémoire). Mais c'est un peu le bordel apparemment:

    "Lorsqu'il n'y a pas assez de mémoire disponible, les opérateurs new et new[] peuvent se comporter de deux manières selon l'implémentation. Le comportement le plus répandu est de renvoyer un pointeur nul. Cependant, la norme C++ indique un comportement différent : si l'opérateur new manque de mémoire, il doit appeler un gestionnaire d'erreur. [...] L'opérateur new est donc susceptible de lancer une exception std::bad_alloc"

    http://casteyde.christian.free.fr/online/cours_cpp/x1968.html

    Et puis surtout tu oublies le delete[]!

  • signaler à un administrateur
    Commentaire de MuPuF le 08/06/2005 17:13:48

    ouille j'avais pas vus qu'il l'avait zappé, un coup a vider sa mémoire lol, une fuite comme ça ... Au passage, y'aurai pas un outils savoir si on a des fuites de mémoire ? et aussi une question:

    char* Mid(char* text,int pos,int len)
    {
         retour = new char[len+1];
         //Code
         return retour;
    }

    Cette fonction fait-elle une fuite de mémoire ? car je ne fais jamais de delete ...

  • signaler à un administrateur
    Commentaire de cosmobob le 08/06/2005 17:22:15

    salut,
    oui ya une fuite de memoire dans ton exemple...
    pour l'enlever: ou bien tu fais delete[] a l'exterieur de la fonction mid
    (par ex:
    char* res = Mid("salut", 5, 6);
    //traitement
    delete [] res;
    )

    ou bien tu renvoies un std::string a la place d'un char*. Dans ce cas t'auras plus de pb.

  • signaler à un administrateur
    Commentaire de vecchio56 le 08/06/2005 17:27:58 administrateur CS

    pour les fuites, en général on fait des macro qui permettent de savoir combien on alloue et combien on libère. C'est deja fait avec visual studio

  • signaler à un administrateur
    Commentaire de ctx_man le 08/06/2005 17:28:21

    je pense que pour stoquer un fichier dans un tableau le mieu est encore d'utiliser les librairies standard en C :

    #include <stdlib> //allocation dynamique
    #include <stdio.h> //gestion des fichiers

    int main(int argc, char *argv[])
    {
         FILE   *fp;
         int    taille;
         char   *fichier;

         //Taille du fichier
         if(fp = fopen("c:/fichier.ext", "rb"))
         {
              fseek(fp, 0, SEEK_END);
              taille = ftell(fp);
              fclose(fp);

              //Allocation de la zone memoire
              if(fichier = (char*)malloc(taille))
              {
                  //Lecture du fichier
                  fp = fopen("c:/fichier.ext", "rb");
                  fread(fichier, 1, taille, fp);
                  fclose(fp);

                  //Ecriture du fichier
                  fp = fopen("c:/fichier.ext", "wb");
                  fwrite(fichier, 1, taille, fp);
                  fclose(fp);

                  //Desallocation (une fois que le fichier n'est
                  //plus utiliser
                  free(fichier);
              }
         }
    }

  • signaler à un administrateur
    Commentaire de MuPuF le 08/06/2005 17:31:22

    COSMOBOB:OUF !!! J'ai donc pas de fuite, je me doutais bien que ça marchais comme ça mais n'ayant jamais rien lus dessus ... Merci je suis soulagé lol

    vecchio56: Merci, pour ta réponse, je vais me renseigner

  • signaler à un administrateur
    Commentaire de vecchio56 le 08/06/2005 17:33:23 administrateur CS

    T'as peut être pas bien compris ce qu'a dit cosmobob, relis bien le début à haute voix

  • signaler à un administrateur
    Commentaire de BruNews le 08/06/2005 17:47:53 administrateur CS

    Et avec toutes ces lib, si on n'a pas pu ouvrir le fichier, il n'a pas de taille ???

  • signaler à un administrateur
    Commentaire de MuPuF le 08/06/2005 17:55:03

    vecchio56: ben dans mon exemple j'ai pas mis l'appel, mais mon appel est le meme que le siens donc, si il dit que la ya plus de fuite, ben ça veut dire que j'en ais pas, je me doutais bien que le compilo fera ça, mais de la a etre sur, ya un grand pas ...

  • signaler à un administrateur
    Commentaire de TeLeTUbIz le 08/06/2005 18:24:40

    oui oui, dslé mon code était pas pour ca.
    J'ai zapé les destructions (mais on aurait pu utiliser un std::auto_ptr) et j'ai fait aucune vérification, sur l'ouverture du fichier par exemple. J'ai vraiment fait à l'arrach, dslé :)

  • signaler à un administrateur
    Commentaire de bboygab le 15/06/2005 11:22:09

    sinon comment on fait pour assigner plusieurs fichiers de tout type a une chaine de caractère ? j'ai voulu tester avec un tableau à 2 dimentions mais je m'en sors pas   merci d'avance .

  • signaler à un administrateur
    Commentaire de TeLeTUbIz le 15/06/2005 11:58:32

    hein ?
    concatener les fichiers dans une string ? c'est ca ?

  • signaler à un administrateur
    Commentaire de bboygab le 15/06/2005 12:27:00

    non en faite regarde je suis sur un projet ou je dois créer un fichier .dat ou dedans je vai pouvoir mettre plusieur société dedans et chaque société devra avoir plusieur fichier licence 50 au maximum et moi se son ces fichier licence qui me pose problème d'une part je dois en passé plusieur a une societe et d'autre part c fichier licence existe déjà il fau juste que je les assigne a une société voilà si ta une solution ça serait simpa merci

  • signaler à un administrateur
    Commentaire de mimou20052005 le 01/07/2005 14:58:41

    je crois que je suis pas initié aux STL
    j'ai compilé (vc++ 6.0)le code de TeLeTUbIz et j'ai obtenu ça :
    Compiling...
    stringf.cpp

    D:\ptjc++\fichier_into_string\stringf.cpp(4) : error C2871: 'std' : does not exist or is not a namespace

    D:\ptjc++\fichier_into_string\stringf.cpp(19) : error C2653: 'ios_base' : is not a class or namespace name

    D:\ptjc++\fichier_into_string\stringf.cpp(19) : error C2065: 'end' : undeclared identifier

    D:\ptjc++\fichier_into_string\stringf.cpp(21) : error C2653: 'ios_base' : is not a class or namespace name

    D:\ptjc++\fichier_into_string\stringf.cpp(21) : error C2065: 'beg' : undeclared identifier

    D:\ptjc++\fichier_into_string\stringf.cpp(26) : error C2065: 'res' : undeclared identifier

    D:\ptjc++\fichier_into_string\stringf.cpp(26) : error C2228: left of '.assign' must have class/struct/union type

    D:\ptjc++\fichier_into_string\stringf.cpp(30) : error C2065: 'getch' : undeclared identifier
    Error executing cl.exe.

    fichier_into_string.exe - 8 error(s), 0 warning(s)

  • signaler à un administrateur
    Commentaire de TeLeTUbIz le 01/07/2005 16:02:54

    as tu pensé à faire les include ?
    #include <string>
    #include <fstream>
    #include <iostream>
    using std::string;
    using std::ios_base;
    using std::ios;
    using std::cout;
    using std::endl;
    using std::fstream;

    #include <conio.h> // propre à Visual C++ (sinon getch() existe ailleurs)

    ou alors remplacer tout les using par:
    using namespace std; // si tu veux faire le bourrin

Ajouter un commentaire

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS