Newsgroup: it.comp.lang.c++
Titolo: lettura file

Salve volevo chiedervi un aiuto per questo pezzo di codice, la sua funzione
è leggere da un file strutturato cosi
-----------------------------
//moto.txt
yamaha 1998
kawasaki 1996
..
..
//con 10 coppie nome numero
-----------------------------------------
//lettura.cpp
#include <iostream.h>
#include <fstream.h>
//definizione della struct
struct moto {
char marca[10];
int data;
};
//prototipo di funzione
void lettura(moto[], int);
int main()
{
 cout<<"Inizia programma"<<endl;
 moto vet[10];
//richiama la funzione di lettura
 lettura(vet,10);
 cout<<"File letto"<<endl;
//stampa a video quello che ha letto come verifica
 for (int i=0;i<10;i++) cout<<vet[i].marca<<"\t"<<vet[i].data<<endl;
 return 0;
}
void lettura(moto vet[], int N)
{
  cout<<"Entra nella funzione";
//apre file
  ifstream file("moto.txt",ios::in);
  if (!file) {cout<<"ERRORE!"<<endl; return;}
  char a;
//legge carattere per carattere e mette nella struct poi legge un int e lo
mette sempre nella struct
  for (int k=0;k<N;k++)
  {
   file>>a;
   int j=0;
   while (a!=' ')
   {
    vet[k].marca[j]=a;
    j++;
    file>>a;
   }
   int data;
   file>>data;
   vet[k].data=data;
  }
 return;
}
-----------------------------------
il problema è che quando esegue stampa inizio programma e entrata funzione
poi da errore fatale e termina
secondo voi che sbaglio? grazie

"Fizban" ha scritto
...
:
: void lettura(moto vet[], int N)
:
: {
:   cout<<"Entra nella funzione";
:
: //apre file
:   ifstream file("moto.txt",ios::in);
:
  file.unsetf( ios_base::skipws );
:   if (!file) {cout<<"ERRORE!"<<endl; return;}
:   char a;
:
: //legge carattere per carattere e mette nella struct poi legge un int e lo
: mette sempre nella struct
:
:   for (int k=0;k<N;k++)
:   {
:    file>>a;
:    int j=0;
:    while (a!=' ')
:    {
:     vet[k].marca[j]=a;
:     j++;
:     file>>a;
:    }
     vet[k].marca[j]='\0';
:    int data;
:    file>>data;
:    vet[k].data=data;
     file.ignore( 1000, '\n' );
:   }
:  return;
: }
anche se io preferisco qualcosa tipo:
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
//definizione della struct
struct moto
{
  friend inline istream& operator >> ( istream& in, moto& m )
    { return in >> m.marca >> m.data; }
  friend inline ostream& operator << ( ostream& out, const moto& m )
    { return out << m.marca << '\t' << m.data ; }
private:
  string marca;
  int    data;
};
int main()
{
  cout << "Inizia programma" << endl;
  vector< moto > vet;
  //richiama la funzione di lettura
  {
    ifstream in( "moto.txt" );
    copy(
      istream_iterator< moto >( in ),
      istream_iterator< moto >(),
      inserter( vet, vet.begin() )
    );
  }
  cout << "File letto" << endl;
  //stampa a video quello che ha letto come verifica
  copy(
    vet.begin(),
    vet.end(),
    ostream_iterator< moto >( cout, "\n" )
  );
  return 0;
}
ciao
Massimo

ma io non ho ancora studiato i container e cmq devo farlo senza classi

"Fizban" ha scritto
: ma io non ho ancora studiato i container e cmq devo farlo senza classi
Ti ho segnato gli errori.
Quando apri un file questo viene impostato per saltare i caratteri
bianchi (white spaces ' ' e '\t' etc.) per cui quando fai
file >> a; non ti mettera` mai in a ' ' per cui il tuo codice
iniziava un ciclo infinito.
Poi l'array di char che usi devi comunque terminarlo.
ciao
Massimo

 Poi l'array di char che usi devi comunque terminarlo.
si di questo me ne ero gia accorto, cmq grazie cmq!