Newsgroup: it.comp.lang.c++
Titolo: ...non capisco...Differenze in Run Time dovute al compilatore??

Salve a tutto il NG,
Tempo fa ho scritto un semplice programma C++ che
apre un file in IN/OUT ed effettua l'append.
Ho scritto anche una funzione che gestisca eventuali errori in fase
di apertura del file.
Ebbene tale programma viene compilato senza nessun errore né warning
con vari compilatori: VisualStudio, .NET, DevC++, GNU (per Linux)
Unica differenza:
Con i compilatori DevC++ e GNU mi restituisce un messaggio a video
dovuto a «if (File.rdstate() == ios::failbit)» che per i compilatori di
derivazione
GNU sembra ritornare un valore errato
Qualcuno saprebbe aiutarmi??
Grazie Marco.
Riporto il mio listato qui di seguito:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
void gestErr(fstream &File)
{
  // Effettua un minimo di gestione errori !!
 if (File.rdstate() == ios::eofbit)
 {
   cout << "Errore di apertura file: EOF File!\n";
   cout << endl;
   cin.get();
   exit(1);
 }
 if (File.rdstate() == ios::badbit)
 {
   cout << "Errore di apertura file: Errore di I/O fatale!\n";
   cout << endl;
   cin.get();
   exit(2);
 }
 if (File.rdstate() == ios::failbit)
 {
   cout << "Errore di apertura file: Errore di I/O non fatale!\n";
   cout << endl;
   cin.get();
   exit(3);
 }
 if (File.rdstate() == ios::goodbit)
   cout << "Apertura file: Nessun errore!\n\n";
 // FINE GESTIONE ERRORI
}
int main(int argc, char *argv[])
{
 // Dichiara uno stream di comunicazione in ingresso / uscita
 // quindi bidirezionale, l'ultimo apre il file in append, cio'
 // significa che se il file non esiste allora viene creato!!
 fstream File("test.txt",ios::in | ios::out | ios::app);
 // Effettua un minimo di gestione errori !!
 gestErr(File);
 File.seekg(ios::end); // Va alla fine del file
 // Inserisce "Ciao" nel File - SCRITTURA FILE (alla fine)
 // quindi dopo il primo inserimento -> "Ciao!"
 // quindi dopo il secondo inserimento -> "Ciao!Ciao!"
 // etc.. etc...
 File << "Ciao!";
 static string str;
 File.seekg(ios::beg); // Ritorna all'inizio del File
 File >> str;    // LETTURA DEL FILE
 cout << str << endl; // Visualizza la stringa
 File.close();   // Chiude l'handle di comunicazione con lo stream di In/Out
 cout << endl;
 cin.get();
 return 0;
}

 Qualcuno saprebbe aiutarmi??
Prova così:
fstream File("test.txt", ios::out | ios::app);
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 


 Potresti riportare il messaggio di errore che ti viene restituito in fase
di compilazione ?
Ciao,
Maurizio.

Marco Tonchella ha scritto:

Credo che il modo giusto di usare le condizioni di cui sopra sia con
l'AND binario (più flag possono essere settati allo stesso momento) :
if(File.rdstate() & ios::failbit)
if(File.rdstate() & ios::goodbit)
etc.
Mi viene inoltre il dubbio che rdstate non sia obbligato a ritornare
sempre la stessa cosa se chiamato più volte consecutivamente (anche se
mi pare strano...).
Prova quindi a chiamare rdstate() in cima alla funzione una volta sola
assegnandolo ad una variabile, ed a confrontarne poi il valore
immagazzinato. Magari aiuta, magari no.
In quel caso, dovresti cortesemente fornirci la versione esatta del
compilatore GCC (ultima riga di "gcc -v").
Ciao,
-- 
Matteo Settenvini
FSF Associated Member
Email : 
mat...@member.fsf.org
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d--(-) s+:- a-- C++ UL+++
P?>++ L+++>$ E+>+++ W+++ N++ o?
w--- O- M++ PS++ PE- Y+>++
PGP+++ t+ 5 X- R tv-- b+++ DI+
D++ G++ e h+ r-- y?
------END GEEK CODE BLOCK------

 if(File.rdstate() & ios::goodbit)
è sempre falso.
Infatte, bisogna sapere cosa vuoi fare. Per vedere gli stati dei
bits (per curiosità), il più facile è :
    std::cout << std::hex << File.rdstate() << std::endl ;
Con probabilemente un'uscita di failbit, etc. primo.
Per sapere invece se l'operazione precedente a riuscito:
    if ( File.fail() ) ...
o, più idiomatico:
    if ( ! File ) ...
Dopo (mà solo dopo), se l'operazione non a riuscito:
    if ( ! File.eof() ) //  errore di formattagio o errore IO.
Ma non funzionne 100%.
Nella pratica, la distinzione fra badbit et failbit non
significa quasi niente -- a l'entrata, sarà sempre failbit (con
o senze eofbit), a l'uschita sempre badbit. E eofbit non hà una
significazione ch'a l'entrata, dopo failbit è venuto
posizionnato -- in generale, failbit senze eofbit significa
un'errore, failbit con eofbit o il fine del file, o un'errore.
--
James Kanze                                           GABI Software
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34