begin process at 2010 02 10 16:39:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichiers / Disque Niveau :Débutant Date de création :08/06/2005 Vu :17 056

Auteur : TeLeTUbIz

Ecrire un message privé
Commentaire sur cette source (23)
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.


 Sources du même auteur

Source avec Zip TRI PAR TAS GÉNÉRIQUE. RAPIDE ET EFFICACE.
TOURS DE HANOÏ: INTRODUCTION AUX ALGOS RÉCURSIFS.
Source avec Zip 1 000 000 DE NOMBRES PREMIERS EN 0.062 SECONDES ?
POINTEURS SUR FONCTIONS
Source avec Zip Source avec une capture CRIBLE D'ERATOSTENE ET GÉNÉRATION DE PAGES WEB.

 Sources de la même categorie

Source avec Zip Source avec une capture ID3 TAG COVER ALBUM IMAGE par nanonavich
FILEREADER par FrancoisGauthier
Source avec Zip CLASSE AVANCÉE DE LOG, THREAD SAFE ET DIVERSES SURCHARGES par sboli
Source avec Zip Source avec une capture Source .NET (Dotnet) INFILESEEKER par swonder
Source avec Zip Source avec une capture USB DETECTION par abandonware

Commentaires et avis

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

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

Commentaire de magic_Nono le 08/06/2005 16:34:40

C ANSI ou C++

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 ;-)

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.

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[]!

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

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.

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

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);
          }
     }
}

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

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

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

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

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

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 .

Commentaire de TeLeTUbIz le 15/06/2005 11:58:32

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

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

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)

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

Commentaire de mogador le 19/12/2009 20:15:08

Bonjour,

je souhaiterais convertir n'importe quel type de fichier en language C (txt, jpg, avi, exe

...) en fichier binaire ou plutot en fichier texte contenant un suite de 0 et 1. et la meme

chose faire le contraire.



#include <stdio.h>

int main(int argc, char **argv) {
/*
FILE *fp;
fp=fopen("test.c", "wb");
char x[10]="ABCDEFGHIJ";
fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp);
*/

FILE *fp;
fp=fopen("test.c", "rb");
char x[10];//="ABCDEFGHIJ";
fread(x, sizeof(char), 10, fp);

printf("%d================",sizeof(x));
printf("\n");
for(int i=0;i<sizeof(x);i++)
{



printf("%x==========",x[i]);
//printf("\n");
for(int j=7;j>=0;j--)
{


//printf("(%d)",j);
printf("%d",(x[i]>>j)&(255>>7));


}
printf("\n");
}




}





Merci pour votre aide.

sed

Commentaire de magic_Nono le 28/12/2009 16:40:17

Bonjour.
Pas de rapport avec cette source, mais c'est tout simple à faire, en cas.
tu peux ouvrir ton fichier (extension quelconque en enregistrant la correspondance dans un fichier même nom, même extension+.cod par exemple)
fichier in en binaire, sortie en texte, et tu y place la correspondance binaire de chaque caractère hexa lu.
puis destruction du source.
idem pour le recodage dans l'autre centre.(en veillant à prendre des blocs de 16 0/1)
Basique.

Magicalement.

Commentaire de mogador le 28/12/2009 19:23:39

j'ai essayé ma  ca maeche pas  je  suis encore débutent  en  language c

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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 : 0,655 sec (4)

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