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