PDA

View Full Version : un aiuto per c++...


rastaivory
21-12-2003, 13:20
salve ragazzi...
ho cominciato da qualche mese a programmare in c++ per l'uni, ora sto facendo un programmino che possa gestire le funzioni di carico e scarico di un magazzino... (per ora solo carico ed aggiornamento)
il problema (vd allegato) è che non riesco a far funzionare il ciclo while per l'estrazione dei campi... qualcuno mi può dare una mano?

grazie a tutti per la disponibilità e la gentilezza...

rastaivory
22-12-2003, 09:36
PERFAVORE... dammi quattromila euro...

rastaivory
23-12-2003, 11:14
proprio nessuno?

rastaivory
28-12-2003, 16:30
aiuto...

maxithron
29-12-2003, 11:57
Originariamente inviato da rastaivory
PERFAVORE... dammi quattromila euro...

???

perchè non posti la parte del codice che non ti funge? (oltre a spiegarci la storia dei 4000 euri!!)

rastaivory
01-01-2004, 13:18
questo è tutto il codice...
per i quattromila euro, non vedi colorado cafè?(era un modo per uppare...)


#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>

//struttura dati





struct Data {

};


typedef struct articolo {

char nomearticolo [41];
char kg [6];


}ARTICOLO;

//variabili gestione files

ifstream fin;
ofstream fout;
char nomefile[100];

/////////////////////////////////////////////////////////////////////////////////////

int aggiungispazi (char stringa[], int caratteri);
int cancellaspazi (char stringa[]);

void main () {
char buffer[47];
int i=0;//varaibile di verifica aggiornamento
ARTICOLO newdato;
ARTICOLO olddato;

cout<<"inserisci il nome articolo: ";
cin >>newdato.nomearticolo;
cout<<endl;

cout<<"inserisci i kg: ";
cin >>newdato.kg;
cout<<endl;

//apertura file
strcpy (nomefile,"dati.txt");
fin.open(nomefile);
fout.open(nomefile,ios::out);

if(fin.fail() || fout.fail()){
cout<<"errore";
}

//esecuzione

while (fin.getline(buffer,46)) {

//estrazione campi da articolo
strncpy (olddato.nomearticolo , buffer ,40);
olddato.nomearticolo[40]='\0';
strncpy (olddato.kg ,buffer +41,5);
olddato.kg[5]='\0';
//cancella spazi
cancellaspazi (olddato.nomearticolo);
cancellaspazi (olddato.kg);
//converti kg in int
double oldkg;
oldkg=atof(olddato.kg);
double newkg;
newkg=atof(newdato.kg);
double totkg;
if (strcmp(olddato.nomearticolo,newdato.nomearticolo) == 0) {
totkg=oldkg+newkg;
i=1;
sprintf ( olddato.kg , "%i", totkg );
cout<<"ciao2";
}//fine if

//aggiungi spazi

aggiungispazi (olddato.nomearticolo, 40);
aggiungispazi (olddato.kg, 5);


fout << olddato.nomearticolo << olddato.kg <<endl;

}//fine while


//chiusura file
fin.close();
fout.close();

if (i!=1) {
fout.open(nomefile,ios::app);
//aggiungi spazi

aggiungispazi (newdato.nomearticolo, 40);
aggiungispazi (newdato.kg, 5);

fout << newdato.nomearticolo << newdato.kg <<endl;
fout.close();
}//fine if di aggiunta


}//fine main


//********************************************************
/*
CANCELLA SPAZI
*/

int cancellaspazi (char stringa[]) {

int i;


for(i=strlen( stringa ); i > 0 ; i--){
if (stringa[i] == ' ')
stringa[i] = '\0';

}
return 0;
}

//********************************************************


/*
AGGIUNGI SPAZI
*/


int aggiungispazi (char stringa[], int caratteri) {
int i;

for (i=strlen(stringa); i<caratteri;i++) {
stringa [i]=' ';
stringa[caratteri] = '\0';


}
return 0;
}

pinzi
02-01-2004, 08:11
Non ho ben capito il funzionamento del tuo programma ad ogni modo il ciclo while non verrà mai eseguito perchè l'istruzione:

fin.open(nomefile);

cancella tutti i dati presenti nel file dati.txt . Se vuoi far si che i dati non vengano cancellati devi aggiungere il flag ios::app oppure aprire il file all' interno del ciclo while.
Inoltre ho nontato che dichiari delle variabili all' interno del ciclo e questo potrebbe crearti dei problemi (una variabile deve essere dichiarata una sola volta).

rastaivory
05-01-2004, 11:09
l'ho modificato come dici ma non funziona... :cry:

pinzi
06-01-2004, 10:54
Il programma per come era perima non avrebbe mai funzionato e come ti ho detto non mi è ben chiaro cosa accade dentro il ciclo while. Potresti essere più dettagliato sul perchè non funziona il programma?

rastaivory
06-01-2004, 11:25
dovrebbe essere un piccolo programma per la gestione carico\scaico di un magazzino....
per ora ho implementato solo il carico: in pratica il prg chiede all'utente quale è la merce che deve caricare (cin), controlla che non sia gia presente in magazzino (ciclo while), se è presente aggiorna la quantità (somma), se no crea un nuovo record (fout).
il problema è che non entra nel ciclo while...

rastaivory
06-01-2004, 11:26
dimenticavo...
grazie per l'aiuto:)

pinzi
08-01-2004, 15:24
Usando le modifiche che ti ho suggerito nella precedente risposta il programma entra nel ciclo while purchè esista un file non vuoto chiamato dati.txt( Per come è scritto il tuo programma sembrebbe che sia necessario avere gia questo file).

rastaivory
08-01-2004, 17:25
scusa se sono un po' ottuso ma a me non funziona...
a te funziona?

non è che puoi postare il codice?

pinzi
09-01-2004, 16:40
Di seguito troverai il listato corretto però ricorda di creare il file dati.txt non vuoto è opportunamente formattato(nelle prime 40 colonne i nomi e nelle seguenti 5 i pesi):

#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>

//struttura dati





struct Data {

};


typedef struct articolo {

char nomearticolo [41];
char kg [6];


}ARTICOLO;

//variabili gestione files

ifstream fin;
ofstream fout;
char nomefile[100];

/////////////////////////////////////////////////////////////////////////////////////

int aggiungispazi (char stringa[], int caratteri);
int cancellaspazi (char stringa[]);

int main () {
char buffer[47];
int i=0;//varaibile di verifica aggiornamento
ARTICOLO newdato;
ARTICOLO olddato;

cout<<"inserisci il nome articolo: ";
cin >>newdato.nomearticolo;
cout<<endl;

cout<<"inserisci i kg: ";
cin >>newdato.kg;
cout<<endl;

//apertura file
strcpy (nomefile,"dati.txt");
fin.open(nomefile);
fout.open(nomefile,ios::app);

if(fin.fail() || fout.fail()){
cout<<"errore";
}

//esecuzione
double oldkg;
double newkg;
double totkg;
while (fin.getline(buffer,46)) {
//estrazione campi da articolo
strncpy (olddato.nomearticolo , buffer ,40);
olddato.nomearticolo[40]='\0';
strncpy (olddato.kg ,buffer +41,5);
olddato.kg[5]='\0';
//cancella spazi
cancellaspazi (olddato.nomearticolo);
cancellaspazi (olddato.kg);
//converti kg in int

oldkg=atof(olddato.kg);
newkg=atof(newdato.kg);

if (strcmp(olddato.nomearticolo,newdato.nomearticolo) == 0) {
totkg=oldkg+newkg;
i=1;
sprintf ( olddato.kg , "%i", totkg );
cout<<"\n"<<"ciao2"<<"\n";
}//fine if

//aggiungi spazi

aggiungispazi (olddato.nomearticolo, 40);
aggiungispazi (olddato.kg, 5);
cout <<olddato.nomearticolo << olddato.kg <<endl;

}//fine while


//chiusura file
fin.close();
fout.close();

if (i!=1) {
fout.open(nomefile,ios::app);
//aggiungi spazi

aggiungispazi (newdato.nomearticolo, 41);
aggiungispazi (newdato.kg, 5);

fout <<newdato.nomearticolo << newdato.kg <<endl;
fout.close();
}//fine if di aggiunta


}//fine main


//********************************************************
/*
CANCELLA SPAZI
*/

int cancellaspazi (char stringa[]) {

int i;


for(i=strlen( stringa ); i > 0 ; i--){
if (stringa[i] == ' ')
stringa[i] = '\0';

}
return 0;
}

//********************************************************


/*
AGGIUNGI SPAZI
*/


int aggiungispazi (char stringa[], int caratteri) {
int i;

for (i=strlen(stringa); i<caratteri;i++) {
stringa [i]=' ';
stringa[caratteri] = '\0';


}
return 0;
}