Newsgroup: it.comp.lang.c++
Titolo: Impossibile con getline......

Quello che volevo chiedervi e' un suggerimento su come passare su un vettore
una stringa di numeri precedentemente copiata su un file.
In pratica scrivo sul file "pollo" (e mi ci identifico) il vettore num
modificato (ad ogni elemento viene sommato 1).
Quello che vorrei fare e' "riavere" dal file
il mio vettore in modo da poter sottrarre ad ogni elemento 1, ed ottenere il
vettore originale.
La funzione getline pero', mi restituisce il contenuto del file sotto forma
di stringa (come prevede il suo prototipo) e questo mi impedisce di lavorare
sugli elementi del vettore.
#include <iostream>
#include <fstream>
class prova_IO {
public:
void prova_O(int num[8],int x,char *nome_file);
};
void prova_IO::prova_O(int num[8],int x,char *nome_file)
{
ofstream out(nome_file);
for(int i=0;i<8;i++)
{
num[i]+=x;
out<<num[i];
}
out.close;
}
main()
{
ifstream in("pollo");
int num[8]={122,114,65,63,78,93,100,12};
char buff[20];
int x=1;
prova_IO p;
p.prova_O(num,x,"pollo");
while(in)
{
in.getline(buff,20);
cout<<buff<<endl;
}
in.close();
return 0;
}
Ringrazio chiunque voglia darmi un suggerimento (compreso quello di
continuare a studiare ancora per parecchio tempo il linguaggio).
Ciao Gianni
--
Posted from 
twingo.tiscalinet.it
 [195.130.224.85] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message
011d01c02852$4917f4f0$c0990b3e@default...

queste istuzioni aprono un file costuito da una matrice di 5x40 e sfruttando
il fatto che l'operatore >> legge qualsiasi carattere fermandosi non appena
trova spazi,tabulazioni memorizzo i numeri nell'array dati, poi posso farci
quello che voglio.
float dati[5][40];
        ifstream infile;
    infile.open("prova.txt");
    if (!infile) return 0;
  while (!infile.eof())
     {
       for (int j=0;j<40;j++){
             for (int i=0;i<5;i++)
               { infile >> dati[i][j]; }
                                         }
                                                 }
      infile.close();

Ho modificato il programmino seguendo i tuoi consigli, ma la "stampa" del
vettore e' diversa dal contenuto del file.....forse ho sbagliato qualcosa.
#include <iostream>
#include <fstream>
class prova_IO {
public:
void prova_O(int num[8],int x,char *nome_file);
};
void prova_IO::prova_O(int num[8],int x,char *nome_file)
{
ofstream out(nome_file);
for(int i=0;i<8;i++)
{
num[i]+=x;
out<<num[i];
}
out.close;
}
main()
{
ifstream in;
int num[8]={122,114,65,63,78,93,100,12};
int buff[8];
int x=1;
prova_IO p;
p.prova_O(num,x,"pollo");
in.open("pollo");
if(!in)
return 0;
while(!in.eof())
{
for (int j=0;j<8;j++)
in>>buff[j];
}
in.close();
for (int k=0;k<8;k++)
cout<<buff[k]<<endl;
return 0;
}
ciao Gianni


 }
Basta semplicemente che aggiungi '\n' nella riga out<<num[i]; e () nella
riga out.close; (oppure toglila) così la funzione diventa:
void prova_IO::prova_O(int num[8],int x,char *nome_file)
{
ofstream out(nome_file);
for(int i=0;i<8;i++)
{
num[i]+=x;
out<<num[i]<<'\n';
}
}
adesso vedrai che funzionerà (out.close() non serve visto che viene fatto
dal distruttore di ofstream).
Vorrei fare una considerazione.
Se i tuoi numeri sono soltanto interi a poche cifre va bene anche scriverli
in formato ascii, ma se usi numeri (interi o double) con 10-20 cifre allora
ti conviene salvare i numeri in formato binario utilizzando write e read in
questo modo:
void prova_IO::prova_O(int num[8],int x,char *nome_file)
{
ofstream out(nome_file);
for(int i=0;i<8;i++)
{
num[i]+=x;
out.write((char *)&num[i],sizeof(int));
}
}
main()
{
ifstream in("pollo",ios::binary);
int num[8]={122,114,65,63,78,93,100,12};
int buff[8]; int x=1;
prova_IO p;
p.prova_O(num,x,"pollo");
if(!in) return 0;
while(!in.eof())
{
for (int j=0;j<8;j++)
in.read((char *)&buff[j],sizeof(int));
}
for (int k=0;k<8;k++)
cout<<buff[k]<<endl;
return 0;
}
Cristiano

 }
l'errore potrebbe essere qui. Scrivi tutti i numeri senza mettere alcuno
spazio. Quando poi vai a rileggerli, te li ritrovi tutti di seguito:
prova cosě
for ( int i = 0; i < 8; ++i)
{
    num[ i] += x;
    out << num[ i] << ' ';
}
out << '\n';
out.close();