PDA

View Full Version : [C++]Scrittura su file AIUTO PROBLEMA ESAME... è facile...


Rageh
19-09-2007, 10:46
Ciao ragazzi... sto diventando matto... sto ***** di prof ci ha penalizzato a tutti perchè non abbiamo seguito i suoi corsi, e ci ha messo l'input/output su file quando la cosa non doveva entrare nell'esame...

Dunque il programma mi fa inserire gli elementi di una matrice, e me li stampa su un file.txt in formato CSV, e dopo ogni riga va a capo, e fin qui tutto ok.

Ora devo creare un sottoprogramma che leggendo gli elementi dal file mi crea un vettore che ha per elementila somma dei numeri ricavati da ciascuna riga del file, non ci riesco.


ogni aiuto è apprezzatissimo... lo scritto ormai è andato... ora vorrei che funzionasse per l'orale...

Programma completo, corretto ore 12.38
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

void input_matrice (int n);
void calcola_vettore_somma (int V[]);
void output (int V[], int n);

int main ()
{ int n, *V;
cout<<"Inserire il riemp: ";cin>>n;

V = new int [n];

input_matrice(n);
calcola_vettore_somma(V);

output(V, n);

system ("PAUSE");
return 0;
}




void input_matrice (int n)
{
int j = 0;
int temp;

ofstream out;
out.open ("elementi_matrice.txt", ios::out);
out<<n<<"\n";

while (j<n)
{
for (int i=0; i<n-1; i++)
{
cout<<"Inserire l'elemento della riga "<<j+1<<" colonna "<<i+1<<": ";
cin>>temp;
out<<temp<<", ";
}

cout<<"Inserire l'elemento della riga "<<j+1<<" colonna "<<n<<": ";
cin>>temp;
out<<temp<<"\n";
j++;
}
out.close();
}

void calcola_vettore_somma (int V[])
{
int n;
int temp;

ifstream in;
in.open ("elementi_matrice.txt", ios::in);

in>>n;

while(in>>temp)
{ cout<<temp;
for (int i=0; i<n; i++)
V[i]=temp+V[i];
}
in.close();
}

void output (int V[], int n)
{
system ("cls");
cout<<"(";
for (int i=0; i<n-1; i++)
cout<<V[i]<<", ";
cout<<V[n]<<")";
}

Il problema è qui
void calcola_vettore_somma (int V[])
{
void calcola_vettore_somma (int V[])
{
int n;
int temp;

ifstream in;
in.open ("elementi_matrice.txt", ios::in);

in>>n;

while(in>>temp)
{ cout<<temp;
for (int i=0; i<n; i++)
V[i]=temp+V[i];
}
in.close();
}

okay
19-09-2007, 10:53
for (int i=0; i<n; i++)
somma+=V[i];

Rageh
19-09-2007, 11:06
Cosa mi cambia così?

okay
19-09-2007, 11:11
Cosa mi cambia così?

su somma addizioni il valore diV(i)

somma=0
v(0)=3
v(1)=5
v(2)=2

somma=somma+v(0) = 3
somma=somma+v(1) = 8
somma=somma+v(2) = 10

print somma = 10

edit: naturalmente se i tuoi calcoli sono giusti... e questo non mi và di verificarlo.
"...ottenere la somma degli elementi..."

Rageh
19-09-2007, 11:20
No aspetta okay... il problema non è questo


il problema è che devo prendere un numero alla volta da un file txt...

Sommare tutti quelli che si trovano su una stessa riga...

e costruire un vettore che ha per elementi le varie somme...

come faccio ad usare il costrutto getline... ifstream... mi serve capire questo... la somma la so fare.... soprattutto perchè i numeri sono CSV............ GRAZIE MILLE A TUTTI

trallallero
19-09-2007, 11:22
void calcola_vettore_somma (int V[])
...
in.getline(V[i],256,',');
...


cosa ti stai inventando ? :D

le uniche 2 getline hanno char* come primo parametro ...

istream& getline( char* buffer, streamsize num );
istream& getline( char* buffer, streamsize num, char delim );


non ho visto il resto


EDIT: forse ho capito, hai sbagliato alla getline, devi mettere
in.getline(temp,256,',');

Rageh
19-09-2007, 11:25
Hai detto proprio la parola giusta... inventando :(


alla fin fine...
come faccio a prendere un numero alla volta da una riga,soprattutto quando fra un numero e l'altro c'è una "Virgola"... e a fine riga andare a capo?

okay
19-09-2007, 11:28
No aspetta okay... il problema non è questo


il problema è che devo prendere un numero alla volta da un file txt...

Sommare tutti quelli che si trovano su una stessa riga...

e costruire un vettore che ha per elementi le varie somme...

come faccio ad usare il costrutto getline... ifstream... mi serve capire questo... la somma la so fare.... soprattutto perchè i numeri sono CSV............ GRAZIE MILLE A TUTTI


e come è fatto il file testo elementi_matrice.txt scrivi come è fatto il txt da leggere

Rageh
19-09-2007, 11:30
subito!! se io inserisco come riga/colonna 3 e come numeri 1 2 3 4 5 6 7 8 9...

mi crea:

3
1, 2, 3
4, 5, 6
7, 8, 9

e fin qui ci siamo, perchè sono CSV

poi...
mi dovrebbe restituire il vettore:

V = (6,20,24)

ma niente!

trallallero
19-09-2007, 11:33
Hai detto proprio la parola giusta... inventando :(


alla fin fine...
come faccio a prendere un numero alla volta da una riga,soprattutto quando fra un numero e l'altro c'è una "Virgola"... e a fine riga andare a capo?

io ultimamente sto lavorando in C e comunque non sono forte in STL del C++.
Ma vedo un po di errori:

in.getline(V[i],256,',');
deve diventare
in.getline(temp,256,',');

V[i] += temp;
deve diventare
V[i] += atoi(temp);
(ma qui usi C ? non e´ meglio string del C++? )

in.getline(temp);
oltre a essere sbagliata (al limite in.getline(temp, 256);) non capisco a cosa serva.

Questio non sono errori logici, quelli non li ho cercati ;)

Furla
19-09-2007, 11:37
lascia stare il getline...
usa semplicemente l'operatore >> che si ferma ad ogni spazio ed ignora le virgole.

Rageh
19-09-2007, 11:40
Ho corretto quella parte con quegli orrendi getline
(il prof ci ha dato string come libreria quindi ci ha tratto in inganno)

void calcola_vettore_somma (int V[])
{
int n;
int i = 0;
int temp;

ifstream in;
in.open ("elementi_matrice.txt", ios::in);

in>>n;

while (i<n)
{
V[i] = 0;
for (int j=0; j<n; j++)
{
in>>temp;

V[i] += temp;


}
}
in.close();
}

void output (int V[], int n)
{
system ("cls");
cout<<"(";
for (int i=0; i<n; i++)
cout<<V[i]<<", ";
cout<<")";
}

il programma si blocca.

trallallero
19-09-2007, 11:48
while (i<n) ... se non incrementi i la vedo difficile uscire dal ciclo

Rageh
19-09-2007, 11:53
Avevo dimenticato i++ nel ciclo while,

comunque mi dà dei valori sbagliati...
void calcola_vettore_somma (int V[])
{
int n;
int i = 0;
int temp;

ifstream in;
in.open ("elementi_matrice.txt", ios::in);

in>>n;

while (i<n)
{
V[i] = 0;
for (int j=0; j<n; j++)
{
in>>temp;

V[i] = temp + V[i];


}
i++;
}
in.close();

Mi legge sempre e solo il primo elemento e non gli altri!

Rageh
19-09-2007, 14:11
PROBLEMA RISOLTO!!!!
for (int i=0; i<n; i++)
{ V[i] = 0;
for (int j=0; j<n-1; j++)
{
in.getline(temp,100,',');
V[i]+=atoi(temp);
}
in.getline(temp,100);
V[i]+=atoi(temp);
}
in.close();
}


Grazie a tutti.