Ifstream::get() C++

sixela4 -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
sixela4
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
sixela4
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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