[stl] connaitre la taille d'un fichier et copier dans un string

Soyez le premier à donner votre avis sur cette source.

Snippet vu 24 169 fois - Téléchargée 31 fois

Contenu du snippet

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 / Exemple :


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.

A voir également

Ajouter un commentaire

Commentaires

mhido123
Messages postés
2
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
28 novembre 2010
-
Bonjour Mr , Je veux connaitre comment modifier dans un fichier et merci d'avance ....
cs_mogador
Messages postés
33
Date d'inscription
mercredi 18 octobre 2000
Statut
Membre
Dernière intervention
4 janvier 2010
-
j'ai essayé ma ca maeche pas je suis encore débutent en language c
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1 -
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.
cs_mogador
Messages postés
33
Date d'inscription
mercredi 18 octobre 2000
Statut
Membre
Dernière intervention
4 janvier 2010
-
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
TeLeTUbIz
Messages postés
215
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
25 septembre 2010
-
as tu pensé à faire les include ?
#include <string>
#include <fstream>
#include
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.