Bonjour !
Tout d'abord, votre programme ne teste pas que les actions ont été correctement effectuées !
-> la méthode "open" ne renvoie rien, il faut tester que l'ouverture s'est bien passée avec la méthode "isopen"
-> Après chaque opération ">>" et "<<" il peut être intéressant de tester le retour à l'aide de la méthode "fail" (qui renvoie "true" si une erreur s'est produite durant la lecture/écriture).
En instrumentant votre programme, vous vous rendrez compte, durant la deuxième phase, que les lectures se passent correctement puis que la première écriture se passe mal. Ensuite, toutes les opérations échouent (les pointeurs de lecture / écriture sont positionnés à -1, plus aucune opération n'est réellement effectuée).
Pourquoi ce fonctionnement ?
Je ne saurais vous le dire exactement ... Mais, de toutes façons, modifier des valeurs dans un fichier "texte", avec donc des valeurs qui n'ont pas la même taille, ne peut fonctionner correctement (remplacer dans le texte "-10" par "10" donnerait "100" à la relecture).
Par ailleurs, quand vous lisez (<< ) dans le fichier, le pointeur de lecture et d'écriture sont décalés (ce qui signifie que vous écririez dans le fichier juste après ce que vous venez de lire, au lieu de remplacer ...).
Si vous voulez faire ce genre de modifications :
* Lisez et écrivez des valeurs en binaire, qui ont tous la même taille,
* Avant de réécrire, décalez le pointeur d'écriture pour réécrire à l'endroit de votre lecture, pas à la suite ...
Sinon, une version qui fonctionne presque (les fonctionnement n'est pas exactement le même en début de ligne, en milieu de ligne et en fin de ligne) serait la suivante (mais la façon de faire est "très moche" ):
Code :
- #include <iostream>
- #include <fstream>
- #include <string>
- using namespace std;
- int main()
- {
- int i,j,k,n;
- n = 10;
- string filename;
- filename = "file.txt";
- cout << filename << endl;
- // Write
- ofstream ofs;
- ofs.open(filename.c_str());
- for(i=-n;i<n;i++)
- {
- for(j=-n;j<n;j++)
- ofs << i*j << " ";
- ofs << endl;
- }
- ofs.close();
- // Read and change
- fstream fs;
- fs.open(filename.c_str(), ios::in | ios::out );
- long pos = 0;
- for(i=-n;i<n;i++)
- {
- for(j=-n;j<n;j++)
- {
- fs >> k;
- if (k<0)
- {
- fs.seekg(pos+1);
- fs << -k << " " ; // <-- On rajoute un espace pour que le nombre positif prenne autant de place que le nombre négatif pour ne pas tout décaler ...
- }
- pos = fs.tellg();
- }
- }
- }
|
J'espère avoir été clair et vous avoir aidé !
Bon courage !
Message édité par Farian le 18-09-2012 à 23:41:40