Ifstream::get() C++

Fermé
sixela4 - 22 août 2011 à 22:36
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 23 août 2011 à 14:43
Bonjour,

J'apprend la programmation en C++ depuis quelque temps. Je voudrais lire un fichier en passant par la fonction <i>flux.get()</i> mais le get saute des caractères. Est-ce normal.
Pour plus de précision, il ne saute pas de caractère si il n'y a plus de retour à la ligne après le caractère lu,
il saute un caractère sur deux si il y a un retour à la ligne après le caractère lu,
il saute deux caractères sur trois s'il y a deux retour à la ligne après le caractère lu...

la code:

caractere=flux.get(); //lit le caractere
cout << caractere; //affiche le caractère
fichier >> caractere; //enregistre dans un fichier


Les flux sont déclarer le plus simplement possible (ifstream flux("a.txt") ofstream flux("b.txt")

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 23/08/2011 à 00:16
C'est l'opérateur << qu'il faut utiliser pour ofstream, l'opérateur >> n'est pas défini !

ifstream entree("a.txt"); 
ofstream sortie("b.txt"); 

char caractere = entree.get(); 
cout << caractere; 
sortie << caractere;

La confiance n'exclut pas le contrôle
1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
23 août 2011 à 07:48
oui, il faut mettre le flux en premier puis les flèches qui vont bien et enfin la variable ; puis à nouveau éventuellement les flèches. Ce que tu fait est syntaxiquement correcte met tu mets le contenu de fichier dans caractère, pas étonnant que tu n'es pas ce que tu veux.
L'erreur que je commet généralement c'est caractère>>fichier; (l'inverse de toi) la logique est respecté, mais c'est faux :-(
0
désolé, j'ai fait une erreur dans la question. Je n'ai pas internet sur l'ordinateur où je programme.

Pour info, mon IDE est Code::Blocks.

Voilà le principal du code:
<pre>


ifstream fluxAC(fichierAC.c_str());
if (fluxAC)
{
cout << "Choisissez un code : ";
cin >> code;
cout << "choisissez un nom (ex. \"c.cry\") : ";
cin >> fichierC;
ofstream fluxC(fichierC.c_str());
if (fluxC)
{

fluxAC.seekg(0,ios::end); //prend la taille du fichier
taille=fluxAC.tellg(); //prend la taille du fichier
fluxAC.seekg(0,ios::beg); //revient au début

while(fluxAC.tellg()<taille) //vérifie qu'il n'est pas à la fin
{
fluxAC.get(lettre); //prend une lettre
lettreCode=lettre; //prend la valeur unicode de la lettre
fluxC << lettre;
}
}
else
{
cout << "ERROR : impossible d'ecrire le nouveau fichier" << endl;
}


}
else
{
cout << "ERROR : fichier introuvable" << endl;
</pre>
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 août 2011 à 14:06
Il faudrait que tu indiques le type de tes variables (lettre et lettreCode au moins).
Quel est le but de ton programme exactement ?
Tes erreurs viennent très certainement de tes tellg() je ne vois pas du tout pourquoi tu te sers de ça ici, pour savoir si le fichier est terminé il suffit d'utiliser eof() pas la peine de faire des allers-retours comme ça pour connaître une taille de fichier en int (qui sera donc fausse au-dessus de 2Go)
0
Merci beaucoup, mais pourrais-tu préciser? Je ne connais pas eof(). (Je débute).

lettre est un char.
lettreCode est un int.

En fait, j'ai enlever quelques lignes entre
lettreCode=lettre; //prend la valeur unicode de la lettre
et
fluxC << lettre;

je faisait quelques opérations sur les lettres (problème console Windows).
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 23/08/2011 à 14:46
Pour faire ce que je crois que tu veux faire, on peux faire comme ça :
Cependant, je ne suis pas sûr du tout que ça marche si c'est des fichiers binaire ou Unicode !

int main()
{
	ifstream entree("D:\\test2.jpg"); 
	if (!entree.is_open())
		return 1;

	ofstream sortie("D:\\test3.jpg"); 
	if (!sortie.is_open())
	{
		entree.close();
		return 1;
	}

	int n;
	while (!entree.eof())
	{
		n = entree.get();
		cout << n << endl;
		sortie << (char) n;
	}

	sortie.close();
	entree.close();

	return 0;
}
0