Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture / Ecriture de fichier en C++

la lecture / ecriture ne marche pas

20 janvier 2010 à 17:05:03

Bonjour.
Voilà, je dois donc à un moment (x) lire un fichier et écrire dedans. (en fait, à plusieurs moments, mais ça marche déjà pas !)


Alors, bon, j'ia mes vérifications que le fichier existe, qu'il a bien été ouvert (en fait, on l'ouvre en
fstream MON_FICHIER("exemple_pour_ce_forum.txt", ios::in | ios::out | ios::ate);
[évidemment, il s'appelle pas comme ça ! ^^ ], ensuite, je test s'il est bien ouvert. Sinon, je l'ouvre en ofstream(ios::out), en mode écriture simple, pour le créer donc. )Ensuite, j'ai donc un fichier ouvert, soit en mode read/write, soit en mode write, et s'il était ok (donc ouvert en mode read/write), je le lis, et après, et ce qu'importe comment il a été ouvert, j'écris dedans.

Bon, alors, mon code compile, ok. Le fichier s'ouvre bien, ok. S'il existe pas, il est bien crée, ok. J'ai mis des répères avec cout pour savoir si le bon morceau de code s'exécutais, oK. Mon SEUL et UNIQUE problème n'est pas une erreur. C'est juste que le code s'execute, mais, ne marche pas ! ^^
string ligne;
bool continuer = true;

while(getline(MON_FICHIER, ligne) && continuer) {

            if(ligne == new_file) {

                continuer = false;
            }

        }

(note : cette lecture sert à savoir si le contenue (qui est OK) de new_file est déjà écris dedans le fichier. J'ai déjà tout vérifié, tout, la ligne s'execute sans problème, mais QU'IMPORTE la situation, ligne ne contient JAMAIS RIEN !)

De même, en écriture :
MON_FICHIER << new_file << endl;


Donc là, si en fait MON_FICHIER ne contenait pas le contenue de new_file, on l'y ajoute. Bâ, là non plus, pas de bug, rien, sauf que si j'ouvre le fichier en question, bâ, le contenue de new_file (qui est LUI AUSSI OK !!) n'est PAS dans le fichier.

En bref, je résume ! ^^

j'ouvre mon fichier, je vérifie qu'il est ouvert, s'il n'existe pas, je le crée, tout est ok.
Mes variables pour le contenue (new_file), j'ai vérifié avec des tonnes de cout, c'est bon.
Le code s'execute sans pb, c'est ok.
la compile plante pas.
Le prog plante pas.

C'est tout ok. Sauf que ma variable 'ligne' ne contient JAMAIS rien qu'importe ce qui est écris dans le fichier, même qu'il soit ouvert en rw, et mon fichier ne comporte rien non plus après l'écriture de new_file, qui elle aussi est ok ! Même en mode rw / w !!

Donc, pourquoi est-ce que mon read et mon write PLANTE ?? (au pire, j'ai qu'à faire ça en C, si comme moi vous voyez pas, mais, ce serait dommage...)


EDIT : nan attendez !!! ça marche.... o_O J'ai passé tout hier à bosser dessus, ça marchait pas !! et là, ça marche.... enfin, j'apporte confirmation, mais ça à l'air.... o_Oo_Oo_O

EDIT: EDIT : en fait, pas totalement ! ^^
Bon, je crois que je vois comment faire pour que ça marche. En fait, ça marche (du moins, l'écriture) DANS LA MESURE OÙ le fichier n'existait pas, donc était ouvert en mode w. Donc, je pense que la soluce pour lire serait de l'ouvrir SEULEMENT en r, puis pour écrire, de le re-ouvrir SEULEMENT en w.
Je teste et vous tiens au courant.

EDIT: EDIT: EDIT : Ben, ça marche... bon, bâ... c'est bon, quelqu'un poste pour que je puisse mettre le sujet en résolu, ou alors, un modo pour le supprimer...
  • Partager sur Facebook
  • Partager sur Twitter
20 janvier 2010 à 17:13:36

Il aurait fallu tester "continuer" d'abord, mais bon, je ne suis pas un partisan du SESE et préfère largement un break.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
20 janvier 2010 à 21:01:51

?

Je ne vois pas ce qui ne va pas dans ce que tu dis !

Hum, bon, j'ai progressé : le fichier est bien changé après écriture. Un hic à cela : normalement, je l'ai ouvert en mode qui ne remplace pas son contenue à l'écriture (ios::ate), sauf que ce n'est ABSOLUMENT pas le cas ! ^^

Sinon, la lecture est toujours sujette à problème. J'ai essayé tous les moyens possibles, autant getline(), que get() ou que >>.

Alors je preneur de toute solution.

Merci !
  • Partager sur Facebook
  • Partager sur Twitter
21 janvier 2010 à 1:19:53

teste la sortie de boucle AVANT la lecture.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
21 janvier 2010 à 22:31:40

Bonsoir,
J'espère que ce code vous aidera

#include <iostream>
#include <fstream>
#include<sstream>
using namespace std;

void main()
{
	int mat;
	for(int i=0;i<10;i++)
	{
		cin>>mat;
	        fstream fichier("../toto.txt",ios::app|fstream::out);
		fichier<<mat<<endl;
		fichier.close();
	}
	fstream fichier("../toto.txt",fstream::in);
	string ligne ="";
	while(!fichier.eof())
	{ 
		getline(fichier,ligne);
		cout<<ligne;
		cout<<endl;
	}
	fichier.close();
}
  • Partager sur Facebook
  • Partager sur Twitter
22 janvier 2010 à 3:39:14

Jamais de lecture sur eof. (FAQ!)
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
Anonyme
22 janvier 2010 à 9:04:54

je te conseil d' utilisé soit ifstream ou ofstream selon le mode sur lequel tu veut ouvrir ton fichier ^^
  • Partager sur Facebook
  • Partager sur Twitter
24 janvier 2010 à 11:27:38

bon, alors, aux dernières nouvelles :

hum, mon code est ok, ne merde pas, rien. Pas de bug à la compile. Ok.

Ou pas !

Alors, le test de l'ouverture du fichier se fait correctement. Je l'ouvre d'abord en ifstream, afin de voir s'il existe. Si c'est le cas, je le ferme, sinon, j'informe l'user que le fichier n'existe pas et qu'il sera crée. Ok. Ensuite, je ré-ouvre le même fichier en ofstream, ce qui, s'il existe, l'ouvre, sinon, le crée. Je test pour savoir si il est bien ouvert (un tout petit poil inutile en ofstream ! ^^ ), puis ensuite, j'écris dedans.

Alors, quoi de bon, quoi de pas bon ?

Premièrement, l'ouverture en lecture se fait correctement. Cependant, je n'ai pas réussi à lire une seule ligne du fichier, que se soit avec getline, avec get ou avec cin >> !!

Deuxièmement, l'ouverture en écriture se fait correctement (logique en même temps), je précise lors de l'ouverture que je ne veux pas supprimer le contenue (ios::ate), et j'écris. Bon, ben, il écris, mais qu'importe ce qu'il y avait avant, qu'importe où se trouve mon curseur, le fichier ne contient à la fin QUE CE QUI A ETE ECRIS. Le reste est zappé ! Et ce, même si ce que j'écris est plus court que le texte présent, donc, il ne réécrit pas dessus, il supprime tout simplement le contenu !


Quand j'ai remarqué ça, j'ai vraiment buggué.... :-°
  • Partager sur Facebook
  • Partager sur Twitter
24 janvier 2010 à 12:52:05

Et si tu nous montrait le code ?
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
24 janvier 2010 à 13:39:28

boa, le code n'est pas composé que de ça. Alors, faut que je fasse du tri ! ^^ (et puis il manie plusieurs fichiers, dont un qui ne buggue pas et qui est secondaire : son ouverture ne test que son existence, alors, faut pas s'arrêter dessus !!
  • Partager sur Facebook
  • Partager sur Twitter
25 janvier 2010 à 20:48:52

Bon, alors aux dernières nouvelles : l'écriture marche, il en va de mon ios::ate qu'il a fallu transformer en ios::app.

Cependant, il est toujours incapable de lire le texte présent dans le fichier. Même quand ce texte, copié collé du tuto sur le SdZ, marche seul, dans le cas présent, il ne marche pas (en copié collé !!!!). Aller savoir pourquoi. Je me demande si ce n'est pas parce qu'il test deux fichiers les uns après les autres, mais il me semble que le test du deuxième se fait après la fermeture du premier. Aussi, je verrais ça demain, et je vous dis. Bonne soirée.

EDIT : problème résolu en intégralité, un petit "ios::ate" en trop lors de l'ouverture du ficher en lecture.... >.<"
  • Partager sur Facebook
  • Partager sur Twitter
18 mars 2019 à 20:42:11

Bonjour

Donc mon problème c'est en lire et ecrire sur les fichiers

Quand je compile mon code tout marche bien

Sauf que mon fichier ne se lie pas

Merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter
18 mars 2019 à 23:07:35

Garde bien en tête qu'un fichier se comporte comme une bande magnétique, tu veux pouvoir lire ce que tu as écrit, il te faut revenir en arrière, sinon tu tente de lire les données qui sont après ce qui a été ecrit. Pas de chance dans ton cas, vu que c'est un nouveau fichier, il n'y a rien a lire car tu es déjà a la fin.
  • Partager sur Facebook
  • Partager sur Twitter
20 mars 2019 à 11:53:49

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)