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;
}
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:
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:)
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?
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;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.