Newsgroup: it.comp.lang.c++
Titolo: scrittura su file

C'è scritto da qualche parte come si fa a scriver sui file?
Ciao a tutti
BiK

 C'è scritto da qualche parte come si fa a scriver sui file?
hai provato a cercare ovunque ?

 C'è scritto da qualche parte come si fa a scriver sui file?
Anche sui muri, oserei dire :-)


Dal libro di Bruce Eckel "Thinking in C++", che puoi scaricare liberamente
dal web, Volume 2 capitolo 2:
//: C02:Strfile.cpp
// Stream I/O with files
// The difference between get() & getline()
#include "../require.h"
#include <fstream>
#include <iostream>
using namespace std;
int main() {
  const int sz = 100; // Buffer size;
  char buf[sz];
  {
    ifstream in("Strfile.cpp"); // Read
    assure(in, "Strfile.cpp"); // Verify open
    ofstream out("Strfile.out"); // Write
    assure(out, "Strfile.out");
    int i = 1; // Line counter
    // A less-convenient approach for line input:
    while(in.get(buf, sz)) { // Leaves \n in input
      in.get(); // Throw away next character (\n)
      cout << buf << endl; // Must add \n
      // File output just like standard I/O:
      out << i++ << ": " << buf << endl;
    }
  } // Destructors close in & out
  ifstream in("Strfile.out");
  assure(in, "Strfile.out");
  // More convenient line input:
  while(in.getline(buf, sz)) { // Removes \n
    char* cp = buf;
    while(*cp != ':')
      cp++;
    cp += 2; // Past ": "
    cout << cp << endl; // Must still add \n
  }
} ///:~
Maurus

 #include <iostream>
Bruce Ekcel si sara' impappinato... sta fregnaccia da lui non me
la sarei aspettata.
-- 
C Ya!
/* Cut "DO NOT DISTURB" to reply */

 #include <iostream>
Bruce Ekcel si sara' impappinato... sta fregnaccia da lui non me
la sarei aspettata.
Quale fregnaccia?
Non ti capisco.
Nell'esempio si fa riferimento a un file che Eckel usa spesso per controlli
e che include nei suoi esempi, il file Require.h:
//: :require.h
// From Thinking in C++, 2nd Edition
// Available at 
http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Test for error conditions in programs
// Local "using namespace std" for old compilers
#ifndef REQUIRE_H
#define REQUIRE_H
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <string>
inline void require(bool requirement,
  const std::string& msg = "Requirement failed"){
  using namespace std;
  if (!requirement) {
    fputs(msg.c_str(), stderr);
    fputs("\n", stderr);
    exit(1);
  }
}
inline void requireArgs(int argc, int args,
  const std::string& msg =
    "Must use %d arguments") {
  using namespace std;
   if (argc != args + 1) {
     fprintf(stderr, msg.c_str(), args);
     fputs("\n", stderr);
     exit(1);
   }
}
inline void requireMinArgs(int argc, int minArgs,
  const std::string& msg =
    "Must use at least %d arguments") {
  using namespace std;
  if(argc < minArgs + 1) {
    fprintf(stderr, msg.c_str(), minArgs);
    fputs("\n", stderr);
    exit(1);
  }
}
inline void assure(std::ifstream& in,
  const std::string& filename = "") {
  using namespace std;
  if(!in) {
    fprintf(stderr, "Could not open file %s\n",
      filename.c_str());
    exit(1);
  }
}
inline void assure(std::ofstream& out,
  const std::string& filename = "") {
  using namespace std;
  if(!out) {
    fprintf(stderr, "Could not open file %s\n",
      filename.c_str());
    exit(1);
  }
}
#endif // REQUIRE_H ///:~
Maurus

 Non ti capisco.
La "fregnaccia" (piucchealtro e' un problema "formale") e' questo:
#include <fstream>
#include <iostream>
O si e' impappinato (distrazione) oppure non sa la gerarchia delle
classi di I/O in C++.


 classi di I/O in C++.
Continuo a non capirti.
Quale delle 2 include sarebbe inutile?
Ho provato a compilare l'esempio di Eckel postato, provando a commentare uno
dei 2 include con MSVisual C++ 6 e mi da errori in entrambi i casi, mentre
se li lascio entrambi non commentati, non ho nessun errore.
Maurus

Dovrebbe bastare fstream
Ciao
--
DigitalShock

 Quale delle 2 include sarebbe inutile?
La gerarchia delle classi di I/O del C++ e' abbastanza "intricata".
Per dirla come il salumiere: "fstream" include gia' "iostream",
quindi e' inutile includerli entrambi, e' una cosa che non andrebbe
fatta; se devi lavorare con i files, includi <fstream> e basta.
So di non essere stato chiaro, se vuoi ti mando una jpg con le
relazioni delle classi di I/O.


"Naetius" <naet...@NOTdespammed.comDISTURB> a écrit dans le message news:
Qb2j9.144539$pX1.5...@news2.tin.it...
Maurus scriveva:
La gerarchia delle classi di I/O del C++ e' abbastanza "intricata".
Per dirla come il salumiere: "fstream" include gia' "iostream",
quindi e' inutile includerli entrambi, e' una cosa che non andrebbe
fatta; se devi lavorare con i files, includi <fstream> e basta.
So di non essere stato chiaro, se vuoi ti mando una jpg con le
relazioni delle classi di I/O.
--
C Ya!
/* Cut "DO NOT DISTURB" to reply */
Il problema come ti ho gia' scritto e' che compilando il seguente programma
su MSVisual C++ 6 ottengo errori in compilazione, che non ho se scommento la
riga dell'include iostream:
//: C02:Strfile.cpp
// Stream I/O with files
// The difference between get() & getline()
#include <fstream>
//#include <iostream>
using namespace std;
int main() {
  const int sz = 100; // Buffer size;
  char buf[sz];
  {
    ifstream in("Strfile.cpp"); // Read
    ofstream out("Strfile.out"); // Write
    int i = 1; // Line counter
    // A less-convenient approach for line input:
    while(in.get(buf, sz)) { // Leaves \n in input
      in.get(); // Throw away next character (\n)
      cout << buf << endl; // Must add \n
      // File output just like standard I/O:
      out << i++ << ": " << buf << endl;
    }
  } // Destructors close in & out
  ifstream in("Strfile.out");
//  assure(in, "Strfile.out");
  // More convenient line input:
  while(in.getline(buf, sz)) { // Removes \n
    char* cp = buf;
    while(*cp != ':')
      cp++;
    cp += 2; // Past ": "
    cout << cp << endl; // Must still add \n
  }
} ///:~
Ecco gli errori:
c:\test\console\fileout.cpp(22) : error C2065: 'cout' : undeclared
identifier
c:\test\console\fileout.cpp(22) : error C2297: '<<' : illegal, right operand
has type 'char [100]'
c:\test\console\fileout.cpp(36) : error C2297: '<<' : illegal, right operand
has type 'char *'
c:\test\console\fileout.cpp(38) : warning C4508: 'main' : function should
return a value; 'void' return type assumed
Come vedi a parte il warning inutile, a questo punto non so se il problema
e' nel compilatore microsoft.
Puoi provare a compilarlo con un compilatore piu' conforme allo standard?
Devo pensare che Eckel aveva il mio stesso compilatore allora!
Maurus

"fstream" include gia' "iostream"
Sei sicuro che lo debba *per forza* fare (secondo lo standard)?
-- 
Marco Barisione (ICQ 84277092)

 Sei sicuro che lo debba *per forza* fare (secondo lo standard)?
??? 


Maurus scriveva:
[Errore in quoting]
Con il Borland C++ Compiler 5.5 va liscio, neanche un Warning.


"Naetius" <naet...@NOTdespammed.comDISTURB> a écrit dans le message news:
zs2j9.144641$pX1.5...@news2.tin.it...
Marco Barisione scriveva:

???

Non so cosa dica lo standard nel merito della gerarchia degli include, ma il
Dev C++ ha compilato bene il programma col solo fstream incluso come diceva
Naetius.
Bisogna vedere se effettivamente, come dice Barisone, questa inclusione di
iostream in fstream sia forzata dallo standard o dipende
dall'implementazione delle librerie del compilatore.
Che MSVisual C++ 6 sia fuori standard gia' lo sapevamo comunque.
Maurus

Maurus scriveva:
[Nessun quoting]
Su 
http://offspringonline.supereva.it/cppio.jpg
 trovi la gerarchia
di I/O standard ANSI/ISO 1998.
PS: Quota un pochino meglio per favore.


 PS: Quota un pochino meglio per favore.
Grazie per il link.
Riguardo al quoting, non ho nessun problema con altri utenti.
Il reply di Outlook Express del mio Window ME mi quota automaticamente tutte
le righe precedendole col carattere '>' e con uno spazio.
Stranamente nei reply ai tuoi messaggi, tutto cio' non avviene ed e' la
prima volta che lo vedo.
Usi per caso un programma di quoting automatico?
Maurus
p.s.
Il quoting sopra ho dovuto farlo io a mano.

 Il quoting sopra ho dovuto farlo io a mano.
Hehhhe, uso QuoteFIX...:-)
</OT>


 fatta; se devi lavorare con i files, includi <fstream> e basta.
Gli header standard del C++ possono includere altri header standard,
quindi <fstream> potrebbe includere <iostream>, ma non e` detto che lo
faccia e non vedo nessun motivo per cui <fstream> dovrebbe includere
<iostream>.
E` sempre meglio *non* fare affidamento sulle inclusioni indirette
(che variano da compilatore a compilatore) e includere tutti gli
header che servono: se si usa i/ofstream si include <fstream>, se si
usa cin, cout, ... si include <iostream>, ecc.
        Mauro

 usa cin, cout, ... si include <iostream>, ecc.
"L'header file fstream include iostream, e contiene inoltre le classi
ifstream, ofstream e fstream".
http://offspringonline.supereva.it/cppio.jpg
PS: Fonte: "Da C++ a UML: Guida alla Progettazione", Carlo Savy, ed.
McGraw-Hill; Testo di riferimento nel corso di Laura in Ing. Informatica
alla Universita' degli Studi di Napoli Federico II.
Precisamente troverai lo stesso diagramma a pagina 403 del suddetto testo.


 testo.
Probabilmente ti conviene cambiare testo e usarne uno piu` aggiornato.
        Mauro

 Probabilmente ti conviene cambiare testo e usarne uno piu` aggiornato.
Dopo una gran bella studiata su TC++PL Spec. Ed. di Stroustrup 
(Rif. 21.5 e 21.5.1) devo effettivamente ammettere che cio'
che hai postato e' vero, in piu' devo, onestamente, ringraziarti
per avermi fatto incuriosire e, quindi, approfondire la "ricerca".
Provvedero' quanto prima ad andare a comunicare queste bestialita'
(in effetti non modeste) al prof., anche se l'esame l'ho gia'
sostenuto... ma, sai... fare un esame su cose errate non e' affatto
gratificante ne' ammissible, soprattutto in una facolta' di Ingegneria.
PS: Ad ogni modo fstream eredita da iostream (origine del post):-)


 Per dirla come il salumiere: "fstream" include gia' "iostream",
forse prima di sparare giudizi affrettati sarebbe meglio informarsi, non 
credi?
"[...] it is easy to create software that compiles on one platform, yet 
requires additional #include directives on others. This annoyance stems 
from the fact that the Standard for C++ fails to dictate which standard 
headers must or may be #included by other standard headers. Given such 
flexibility, different implementers have chosen to do different things"
Scott Meyers, Effective STL, Item 48 - "Always #include the proper 
headers"
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

 Per dirla come il salumiere: "fstream" include gia' "iostream",
Ma "fstream" non riguarda i 'concrete general streams'?  E "iostream"
le specializzazioni di input e/o output?  Dovrebbe essere iostream,
semmai, a includere fstream --- e non viceversa.  Comunque vanno
inclusi tutti e due, come ti hanno gia' detto con le parole del Meyers
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

 semmai, a includere fstream --- e non viceversa.  Comunque vanno
http://offspringonline.supereva.it/cppio2.jpg
(Scannerizzazione della pagina riguardante la gerarchia di derivazione
tratta da TC++PL Special Edition di B. Stroustrup).


 PS: Ad ogni modo fstream eredita da iostream (origine del post):-)
iostream e` definito in <istream>, non in <iostream>.
        Mauro


il tutto, ovviamente, con l'esplicito consenso di B. Stroustrup,
giusto?