Ifstream::get() C++
sixela4
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
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")
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
C'est l'opérateur << qu'il faut utiliser pour ofstream, l'opérateur >> n'est pas défini !
La confiance n'exclut pas le contrôle
ifstream entree("a.txt");
ofstream sortie("b.txt");
char caractere = entree.get();
cout << caractere;
sortie << caractere;
La confiance n'exclut pas le contrôle
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 :-(
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 :-(
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>
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>
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)
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)
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).
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).
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 !
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; }