PDA

View Full Version : lettura file esterno con c++


Camacho
26-02-2002, 18:59
So che per leggere un file esterno in c++ lo si può fare con fscanf,ma se ho un file tipo testo con stringhe e numeri come faccio?

cionci
27-02-2002, 11:12
Ci sono tanti metodi per leggere un file...per scegliere il migliore devi verificare com'è il formato del file...

E' un file suddiviso in colonne con larghezza standard ?
E' un file in cui le righe non hanno tutte lo stesso formato ?

Camacho
27-02-2002, 13:51
E' un file che posso leggere con wordpad,notepad quindi come testo.....
Le righe non sono tutte uguali...
Per esempio c'è una riga del tipo:
cell ( #sito
#traffic
#location
)
ecco io in questo devo leggere il valore di traffic e sito ,come faccio?

cionci
27-02-2002, 14:18
Dipende dal formato dei dati...in generale si può procedere leggendo carattere per carattere o riga per riga (con fread o fgets) e analizzando il buffer...
Se il formato è fisso il miglior modo è utilizzare fscanf....cioè vedendo la riga sopra :

fscanf(f,"cell ( #%s\n#%s\n#%s )",s1, s2, s3);

Fammi un esempio di più righe di questo file....

Camacho
27-02-2002, 15:20
Ti mando un esempio di questo tipo di file.
Io devo leggere sopratutto quello che sta dentro le parentesi....per poi creare con queste informazioni delle matrici.
Grazie

a2000
27-02-2002, 16:13
basta poco, che ce vo' :cool:

cionci
27-02-2002, 16:56
Guarda...non è così semplice...anzi...

In pratica quello che vuoi fare si chiama "parsing"...

Ovvero si tratta di riconoscere vari "comandi" e i loro parametri...
Ogni comando ha un suo formato ben preciso...

Ti faccio un esempio...
Leggi un carattere alla volta fino a quando non ottieni in lettura un carattere diverso da una lettera...un ciclo del genere...

char leggiParola(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isalpha(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = '\0'; //carattere di fine stringa...
return tmp;
}

char leggiNumero(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isnumber(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = '\0'; //carattere di fine stringa...
return tmp;
}
.....
.....
....
//comincio leggendo la prima parola
char buffer[1024];
leggiParola(buffer, 1024, f);
//Ora bisogna riconoscere quale comando è stato letto
//Ti faccio un esempio per il comando CELLS
if(!strcmp(parola,"CELLS"))
{
//Abbiamo riconosciuto il comando CELLS
leggiParola(buffer, 2, f);

//buffer[0] ora deve contenere una grafa aperta
if(buffer[0]!='{')
errore(); //Il programma deve terminare all'interno di questa funzione

//a questo punto abbiamo una grafa aperta e ora ci vuole un numero
leggiNumber(buffer, 1024, f);
//Ora dobbiamo aver letto un numero
if(!isnumber(buffer)) errore();
//questa stringa va convertita in un numero con le funzioni atoi o atof
....
}

Insomma tuto funziona così con una bella serie di if...poi è solo un esempi...per rendere più snella la scrittura del codice puoi passare alla funzione leggiParola la parola che vuoi che compaia in modo da far generare l'errore da quella funzione...

Te l'ho detto...non è banale...io in questo modo ci ho scritto un semplice cmpilatore C++...

a2000
27-02-2002, 17:04
Penso che tu (cionci) abbia fatto un fac-simile di routine che risolve (forse) un problema più ampio e con un'intersezione ridotta con il problema del nostro camacho.

Tipico errore della riutilizzabilità: in questo caso (a parte la tua buona volontà) non di una routine (che l'hai scritta di tuo pugno, immagino), ma di uno schema mentale.

ripeto: basta ... meno (diciamo 1/4), che ce vo' :cool: :cool:

a2000
27-02-2002, 21:09
cionci non ti offendere, si fa per confrontarsi .... :)

[comunque non vale bypassare il thread con messaggi in PVT ! :D ]

a2000
27-02-2002, 21:23
per esempio l'operatore Like (VB) potrebbe tornare molto utile :)

a2000
27-02-2002, 21:41
ma non ce n'è neanche bisogno.
mi sembra che il file sia piuttosto strutturato.

cionci
28-02-2002, 07:23
Originariamente inviato da a2000
[B]ma non ce n'è neanche bisogno.
mi sembra che il file sia piuttosto strutturato.
Dipende se lo è sempre...dipende se ha sempre la stessa indentazione...dipende se ha sempre la stessa struttura...dipende da molte cose...

Che intendevi per i messaggi privati ? Io non inviato/ricevuto alcun messaggio privato...

a2000
28-02-2002, 09:04
Originariamente inviato da cionci
[b]
Dipende se lo è sempre...dipende se ha sempre la stessa indentazione...dipende se ha sempre la stessa struttura...dipende da molte cose...


guarda, mi ricordo di avere fatto un "parsing" engine per il riconoscimento di certe parole chiave in un testo letterario in tagiko (!) con un codicillo in QB45 per una tesi ... :)

vogliamo provare ?

cionci
28-02-2002, 09:14
Originariamente inviato da a2000
[B]vogliamo provare ?
A fare cosa ?

Ah, ti volevo far notare che già nelle righe qui sotto la struttura non è fissa...

6 {
C; #site name
1; #sector number
1; #demand/traffic
LOC (9, 10);
LBC 13;
}
7 {
C; #site name
2; #sector number
2; #demand/traffic
LOC (9, 10);
}

a2000
28-02-2002, 09:25
guarda visto che mi hai stimolato, e visto che comunque è sempre un piacere parlare con te, :)
appena arrivo a casa ti mando una cosina che ti lascerà esterreffatto: non solo la struttura del file da leggere non era fissa ma non sapevo esattamente neanche il significato dei vari campi.
tutto in VBA naturalmente. :p

Camacho
28-02-2002, 10:21
A rega! Che succede state a diventa troppo difficili.......
Inoltre io devo anche mettere gli elementi che leggo dentro cell o cell relation in matrici.......Se po fa?

a2000
28-02-2002, 10:27
ma che te devi stà a regolà, a ottimizzà i tempi der rosso dei semafori, dei sensi unici der traffico de Torvergata ?

Se po fà, se po fà ... te lo smonto e rimonto come vuoi il tuo file.

Ma il grafico va bene o no ?

Ciao

-----
|:mad:|
|:)|
|:rolleyes:|
-----

a2000
28-02-2002, 11:14
guarda io ti leggerei il tuo file in una strutturina del tipo:

CELLS(1 To NumCELLS)
.sitename
.sectornumber
.demandtr
.loc(1 To 2)
.lbc 'questo lo farei come variant array

e in una matrice di vicinanza (sempre a struttura dati) del tipo

CELLS_REL (1 To NumCELLS, 1 To NumCELLS)
.xxx
.DA(1 To 2)
.ecc

ti può andare bene ?

però devi dare qualche informazione in più sul significato dei dati.

:mad:
:)
:p

cionci
28-02-2002, 11:34
Ma questo file viene generato da qualche altro programma ? La sequenza delle strutture è fissa ? La formattazione è fissa ?

Camacho
28-02-2002, 14:09
Allora...per quanto riguarda il grafico....perfetto.....alla grande!
Io il mio compito è quello di assegnare le frequenze disponibili su di una rete cellulare...
1-sto programmando in C++ quindi devo creare una routine di lettura per leggere i dati in input
2-Questi dati stanno dentro questo tipo di file
3-Le info che mi servono sono:
numero di siti
numero di celle
numero unita di traffico in ogni cella
4-Poi devo fare un array che contiene chiamato sito[celle] che mi dica per ogni cella quale è il suo sito
5-Un array chiamato cell[trx] che mi dica a quale cella ogni trx appartiene.le trx sono le unità di traffico.
6-Tutto ovviamente deriva dalla mia lettura del file...
7-Dalle cell relations tiro fuori le info sulle interferenze tra trx e le relazioni H tra le celle e questo va messo in matrice....
Insomma mi servono un bel po di info.........
I vari file che devo leggere sono tutti di questo formato...che se non ho capito male mi sembra di aver letto essere scritti in LaTex..

Boh so solo che il prof mi ha detto "E' una cazzata!!!!"..

Grazie Ciao Ragazzi

Camacho
28-02-2002, 14:11
Ah dimenticavo....

site name è il nome del sito
sector number è il numero della cella
traffic demand è quante trx ci sono in una cella

in cell relation il numero indica l'interferenza tra celle e H la relazione di hand-over....

a2000
28-02-2002, 14:23
in effetti lo è :) :cool:

si può fare facilmente una routine che ti legge il file nelle tue matrici però, per quanto mi riguarda, o in VB o in Fortran.

altrimenti si può fare una routine di conversione del file in un formato più pulito e strutturato così da potere utilizzare una semplice routine in C++ di lettura sequenziale.
(qui andiamo allla grande con un tritatutto in VBA !! )

Faccè sapè


P.S.
Ah, allora non sono i semafori di Torvergata ma i telefonini ... ma tu guarda :p

Camacho
28-02-2002, 23:38
Ma se io con un semplice fscanf leggo le varie stringe e poi metto quello che mi srve in array mediante dei cicli for?

cionci
01-03-2002, 00:16
Originariamente inviato da Camacho
[B]Ma se io con un semplice fscanf leggo le varie stringe e poi metto quello che mi srve in array mediante dei cicli for?
Te l'ho detto...se la struttura è fissà lo puoi benissimo fare...


Una struttura come questa...

1 {
A; #site name
1; #sector number
1; #demand/traffic
LOC (3, 5);
}

...sempre se fissa la puoi leggere benissimo con uno fscanf...

fscanf(f,"%d {\n %s; #site name\n %d; #sector number\n %d; #demand/traffic\n LOC (%d, %d);\n }",............);


Mi raccomando devono essere rispettati anche tutti gli spazi...

Camacho
01-03-2002, 00:24
diciamo che leggo la prima,poi devo leggere la seconda che ha la stessa struttura faccio un ciclo for?
Nell'esempio che mi hai fatto quello che leggo dove lo memorizzo?

cionci
01-03-2002, 00:44
Lì non ho messo le strutture...ovviamente ti dovrai fare al tua bella struct...
struct cella {
int sector;
int traffic;
int locX, locY;
};

L'ideale sarebbe memorizzarla in un vettore...
Se il numero di celle è sempre 7 allora ti fa un vettore statico e accedi all'i-esima cella con l'indice (-1)...

Se a priori (prima di leggere il file) non conosci il numero delle celle allora ti conviene usare una lista...le conosci ?

L'unico problema che puoi incontrare è il fatto che il contenuto delle celle non è costante (non ci sono sempre gli stessi parametri, ad esempio LBC non c'è sempre), così come in CELL_RELATIONS non ci sono sempre gli stessi parametri in ogni relazione...

Camacho
01-03-2002, 00:57
il numero di celle le conosco
in cell relations quando non cè H 1 vuol dire che H è 0,mentre se non cè il valore 0,xxxx vuol dire che è 0 anche quello...
l'importante che dal numero di celle tiro fuori il numero di traffic in ognuna di questa.

cionci
01-03-2002, 01:05
Quindi puoi usare un vettore statico...

Camacho
01-03-2002, 01:08
Come inserisco in un vettore una struttura?

cionci
01-03-2002, 01:13
Definisci la struttura come ti ho detto prima e dopo basta fare:

cella vett[N];

N lo devi sostituire con il numero di celle...

/\/\@®¢Ø
01-03-2002, 09:38
Originariamente inviato da Camacho
[B]E' un file che posso leggere con wordpad,notepad quindi come testo.....
Le righe non sono tutte uguali...
Per esempio c'è una riga del tipo:
cell ( #sito
#traffic
#location
)
ecco io in questo devo leggere il valore di traffic e sito ,come faccio?

Se hai la garanzia che tutti gli elementi siano separati da uno o piu' spazi/tabulazioni/return ( come e' l'esempio che hai fatto tu ) allora e' relativamente semplice basta fare una cosa di questo tipo:

#include <string>
#include <vector>
#include <fstream>

using namespace std;

struct cell
{
string sito;
int traffic;
int location;
}

void readCell( istream& in , cell& c )
{
string a,b;
// queste fanno schifo ma servono a saltare la parola 'cell' e la '('
in >> a;
in >> b;
// potremmo controllare che a=="cell" e b==")" ed eventualmente lanciare un'eccezione o ritornare un valore di errore
in >> c.sito >> c.traffic >> c.location;
// anche qui dobbiamo eliminare la
// parentesi di uscita ed
// eventualmente controllare che sia
// appunto una ")"
in >> a ;
}



per leggere le strutture si potrebbe fare ( ad esempio )

ifstream input("file.txt");
int count; // quane ne dobbiamo leggere
cell* table = new cell[count];
for ( int i=0 ; i< count ; i++ )
readCell( input , table[i] );


Poi ci si puo' sbizzarrire , volendo :
che ne so, cambiare readCell in un operator >> cosi' da poter leggere le celle con un "input >> table[i]" :D

Ciao

a2000
01-03-2002, 11:25
Camacho, stammi a sentire, quello che ha inventato il deltaplano era un ingegnere della NASA.
Io mi sforzo ad essere correct, però non posso ammettere che la variabilità di spazi o piccole altre cose possa essere ritenuta un problema.
Non è un problema.
Addirittura si parla ancora del problema di non conoscere a priori le dimensioni di un vettore, di vettori statici ... (i vettori statici li uso solo per boosterare le velocità di calcolo).
Ma scusate ma li avete mai usati, per esempio, i variant array di VB ?

Se vuoi dimmi come deve essere fatto il file dati per essere letto senza problermi con una semplice routine in C++ e ti faccio un convertitore che si mangia il tuo file di testo e genera il file (i files) desiderato/i.
Altrimenti si può fare una routine DLL in Fortran che ti restituisce le tue matrici o sotto forma di strutture dati o di matrici propriamente dette.

E' anche per questo, cionci, che bisogna affrontare problemi grandi (per es. allocamento dinamico e calcolo con matrici 10^4 x 10^4) per risolvere quelli piccoli.
Lo strumento si impara ad usare bene solo quando si affrontano problemi pesanti.
Infatti non a caso il Prof. di Camacho gli ha detto che è una ca++ata.


La conclusione di tutto questo navigare nella sezione del forum è che chi usa il Fortran dovrà imparare il C++ ... per insegnarlo a quelli che lo usano. :(




P.S.
Scusate, ma credo che qualche voce critica e diversa non faccia male. :)

/\/\@®¢Ø
01-03-2002, 13:06
Ho dato una occhiata al file di esempio.
Se ho capito bene il tuo problema e' "solo"
quello di leggere il testo tra
"CELLS {"
e l'ultima }

Allora in tal caso il mio esempio puo' anche andare bene a patto di cambialo un poco. ( avevo capito male la struttura dei dati ).
Resta comunque valida l'idea di utilizzare ( secondo me ) l'operator >> sulle stringhe, visto che e' comodo per separare tutti gli elementi dell'input se questi sono divisi tra loro da spazi, come mi sembra sia il tuo caso ( a parte le coppie (a , b) che sono attaccate alle parentesi )

cionci
01-03-2002, 13:28
Originariamente inviato da a2000
E' anche per questo, cionci, che bisogna affrontare problemi grandi (per es. allocamento dinamico e calcolo con matrici 10^4 x 10^4) per risolvere quelli piccoli.
Lo strumento si impara ad usare bene solo quando si affrontano problemi [b]pesanti.
Infatti non a caso il Prof. di Camacho gli ha detto che è una ca++ata.

Primo in C++ non esistono vettori di variant...si può superare il problema usando la classe vector della STL, ma sinceramente non mi ci sono mai messo...
L'allocamento dinamico in C++ si può fare benissmo...ma è l'allargamento del vettore già allocato dinamicamente che non si può fare (bisogna crearne uno nuovo e spostare il contenuto in quello nuovo)...
Si possono benissimo usare le liste senza incorrere in problemi di allocazione...trovo un nuovo elemento, lo alloco, lo linko alla lista..

Io credo di aver affrontato problemi pesanti in C++...il compilatore C++ che ho fatto non mi sembra una cazzata e nemmeno la rete neurale per il riconoscimento ottico che ho fatto l'anno scorso (visto che a te piace la matematica)...
Credo di avere una buona esperienza di C/C++ (10 anni)...quindi non mi piace stare a sentire i discorsi che fai quando non sai di cosa stiamo parlando...imparati il C++ e poi ne riparliamo...

/\/\@®¢Ø : tu che ne pensi ?

cionci
01-03-2002, 13:32
Originariamente inviato da /\/\@®¢Ø
[B]Resta comunque valida l'idea di utilizzare ( secondo me ) l'operator >> sulle stringhe, visto che e' comodo per separare tutti gli elementi dell'input se questi sono divisi tra loro da spazi, come mi sembra sia il tuo caso ( a parte le coppie (a , b) che sono attaccate alle parentesi )

Concordo...anche perchè si suppone corretto il file...quindi non bisogna fare alcun controllo sintattico...

Camacho
01-03-2002, 13:58
Ragazzi sucsatemi non voelvo che si creassero polemiche....è solo che io purtroppo non ho molto tempo per imparare benissimo il C++ in vista della tesi che è fra un mese(ma conto di farlo appena terminato) e quindi cercavo indizi...
Comuqneu io vi dico quello che devo creare:
un vettore chiamato sito[celle] che mi dica a quale sito o gni cella appartiene.
un vettore cell[trx] che mi dice a quale cella appartiene ogni traffic.
una matrice celle*celle che mi indichi quando se H=1 o a H=0 tra le celle.
una matrice celle*celle che mi dica se l'interferenza(valore 0,xxx presente in cell relation) è diversa da 0.
una matrice celle*canali che quando c'è in cell lbc con un valore,che indica un canale metta in matrice 1 tra la cella e il canale.

Grazie comunque della pazienza e scusatemi.

Ah i miei vettori sono tutti di idmensione fissa.

a2000
01-03-2002, 14:01
Primo in C++ non esistono vettori di variant...si può superare il problema usando la classe vector della STL, ma sinceramente non mi ci sono mai messo...
L'allocamento dinamico in C++ si può fare benissmo...ma è l'allargamento del vettore già allocato dinamicamente che non si può fare (bisogna crearne uno nuovo e spostare il contenuto in quello nuovo)...
Si possono benissimo usare le liste senza incorrere in problemi di allocazione...trovo un nuovo elemento, lo alloco, lo linko alla lista..

male, malissimo, la lista la devi fare solo quando ti sposi :)


Io credo di aver affrontato problemi pesanti in C++...il compilatore C++ che ho fatto non mi sembra una cazzata e nemmeno la rete neurale per il riconoscimento ottico che ho fatto l'anno scorso (visto che a te piace la matematica)...

bravo, 7+ :rolleyes:



Credo di avere una buona esperienza di C/C++ (10 anni)...quindi non mi piace stare a sentire i discorsi che fai quando non sai di cosa stiamo parlando...imparati il C++ e poi ne riparliamo...
tutto devi stare a sentire, anche quello che dice cionci.


/\/\@®¢Ø : tu che ne pensi ?

ARCO è un riflessivo, non si arrabbia per opinioni diverse, al massimo sorvola, come una freccia.




Comunque: alla prova dei fatti.
però questa volta ci mettiamo su 1000 € :)

(come la matrice 1000 x 1000) :cool:

cionci
01-03-2002, 17:50
Originariamente inviato da a2000
[B]Comunque: alla prova dei fatti.
però questa volta ci mettiamo su 1000 € :)

(come la matrice 1000 x 1000) :cool:
Ti ripeto che io a fare un programma del genere non ho nessun problema...
Magari non userò il metodo più semplice o quello + corto...ma stai tranquillo che arriverei ad un risultato...

Per la matrice 1000x1000 sono riuscito ad ottenere 3,2 secondi a 1333 Mhz...

/\/\@®¢Ø
01-03-2002, 19:30
Originariamente inviato da Camacho
[B]Ragazzi sucsatemi non voelvo che si creassero polemiche....è solo che io purtroppo non ho molto tempo per imparare benissimo il C++ in vista della tesi che è fra un mese(ma conto di farlo appena terminato) e quindi cercavo indizi...
Comuqneu io vi dico quello che devo creare:
un vettore chiamato sito[celle] che mi dica a quale sito o gni cella appartiene.
un vettore cell[trx] che mi dice a quale cella appartiene ogni traffic.
una matrice celle*celle che mi indichi quando se H=1 o a H=0 tra le celle.
una matrice celle*celle che mi dica se l'interferenza(valore 0,xxx presente in cell relation) è diversa da 0.
una matrice celle*canali che quando c'è in cell lbc con un valore,che indica un canale metta in matrice 1 tra la cella e il canale.

Grazie comunque della pazienza e scusatemi.

Ah i miei vettori sono tutti di idmensione fissa.


Allora... cerco di ricapitolare un po' per essere sicuro di aver capito giusto.
L'input mi sembra composto da quattro sezioni:
FORMAT , GENERAL INFORMATION , CELLS e CELLS_RELATIONS giusto ? E a te serve leggere le ultime due sezioni.
Piu' cose si possono dare per scontate , piu' semplice si puo' fare il codice: ad esempio, le varie linee con le informazioni sono sempre separate ? O potrebbe capitarmi sulla stessa riga
LOC (9, 10); LBC 13;
( tanto per fare un esempio ).
Poi: le prime tre righe di una CELL sono sempre uguali ?
( ovvero qualcosa del tipo
NOME; #comment
SETTORE; #commento
TRAFFIC; #commento
( anche se penso proprio di si visto che consistono solo del valore, commento a parte ).
Altra cosa che non mi e' chiara:
Altra cosa: come faccio a capire a quale cell appartiene un traffic ? con con il valore TRAFFIC penso, visto che compare uguale su piu' celle !

a2000
01-03-2002, 19:59
ma come ARCO (oh ARCO), da uno che tira d'intuito come te .... dai su !

per cionci:
io ti credo sulla parola, ma mi fanno 'specie' tutte le tue perplessità, i tuoi 'se' e i tuoi 'ma', rispetto a un problema assolutamente standard che dovresti avere affrontato e risolto, in 10 anni di attività Cplusplana, molte volte.
Evidentemente ti si sono presentate altre problematiche e forse ormai non siete più della nostra famiglia (più informatici che ingegneri) e di questo mi dispiace. :(

Ma dei 1000 € ? :cool:



P.S.
caldeggio vivamente informarsi sugli operatori (VB):
Like, Val, Instr, L_R_Trim$, ecc. ecc.
e trovare gli equivalenti C++ (una qualche decina di #include, I suppose) oppure scriverli ex-novo come esercizio per il weekend :)

Poi ragazzi, non vi vorrei usisionare, ma con una Excel_"Importazione guidata testo" e una botta di

For Each Cell in Worksheets("Foglio1").Range("A:AA"
a$ = Cell
If Like(a$, .......
If Like(a$, .......
If Like(a$, .......

.....
.....

Next Cell


vi passa la paura (o vi viene ?) :p

/\/\@®¢Ø
01-03-2002, 20:29
Non e' questione di tirare d'intuito.
Semplicemente Camacho ha detto che vuole

un vettore cell[trx] che mi dice a quale cella appartiene ogni traffic.


Pero' visto che nell'esempio ci sono
2 {
A; #site name
2; #sector number
3; #demand/traffic
LOC (3, 5);
}

5 {
B; #site name
2; #sector number
1; #demand/traffic
LOC (1, 10);
LBC 5 6;
}

che hanno lo stesso sector number, penso che intenda il contrario. ;)

P.S.:
Lo so che il mio nick fa schifo e nessuno lo capisce, ma hai dimenticato la M iniziale :D

/\/\@®¢Ø
01-03-2002, 20:52
uffff. la stanchezza :rolleyes:
ovviamente nel post precedente non intendevo dire che hanno lo stesso sector numbero, ma lo stesso number/traffic, anche l'esempio e' sballato, ma penso si capisca cosa intendevo dire :)

a2000
02-03-2002, 00:00
Caro Camacho,

decisamente, quassù qualcuno ti ama! :)

Guardati e agisci questo file.
La procedura di smontaggio del tuo file di testo (di cui devi dare il nome completo di path) dovrebbe già andare bene.
Può essere resa facilmente più semplice, corta, robusta, resistente alle anomalie/errori di struttura del file, in una parola metallizzata !

A questo punto si può generare il file (anche binario) con le matrici e i vettori che ti servono bell'e pronte per essere lette da C++.
Oppure una routine dil lettura DLL compilata, da richiamare all'interno del codice C++.
Oppure con un pò di pazienza (ma poca poca direi) tradurre la procedura da VB a C++.

Fai sapere. ;)

Buonanotte. :o

Camacho
04-03-2002, 00:27
Site name mi dice il nome del sito nel quale si trova la cella.
sector number mi dice il numero della cella all'interno dello stesso sito.
demand\traffic indica quante antenne trx ci sono in quella cella.
mi interesa dire quindi non lo so.........trx 1 nella cella A1,trx 2 nella cella A2,trx 3 nella cella A2 e cosi via e creare un vettore
cell[trx] che mi dice :
cell[0]=A1
cell[1]=A2
cell[2]=A3
...............
la struttura è sempre lastessa e non avrai mai LBC o LOC sulla stessa riga.
Comunque LOC non mi serve.
Grazie

Camacho
04-03-2002, 00:38
visto i lfile...bello! ma come lo leggo da c++?
E' sicuro si?
mi mancano le trx alle celle
Grazie

a2000
04-03-2002, 10:16
Originariamente inviato da Camacho
[B]visto i lfile...bello! ma come lo leggo da c++?
E' sicuro si?
mi mancano le trx alle celle
Grazie

Ti ripropongo tre soluzioni:

1) generare un file con le matrici e i vettori che ti servono bell'e pronte per essere lette da una routine di lettura sequenziale in C++.

2) routine di lettura DLL compilata, da richiamare all'interno del codice C++, che ti restituisce i vettori richiesti.

3) tradurre la procedura da VB a C++.


Una volta letto il file di testo, comporre il vettore delle trasmissioni alle celle è un problema molto semplice, fidaty. :)

a2000
04-03-2002, 10:22
Originariamente inviato da Camacho
[B]visto i lfile...bello! ma come lo leggo da c++?
E' sicuro si?
mi mancano le trx alle celle
Grazie

come un preservativo.

Camacho
04-03-2002, 13:14
Secondo te quale è la migliore?

a2000
04-03-2002, 13:37
per il tuo prof la 3)
per te la 2)
per me la 1)


Camacho, prepara la Pajata ch'arivo ... :p

Camacho
04-03-2002, 13:40
se la 1 è per te la 3 per il prof la 2 come la faccio io?

a2000
04-03-2002, 13:48
Originariamente inviato da Camacho
[b]Secondo te quale è la migliore?

ho inteso "qual'è la migliore" soluzione per te, per avere tu la soluzione più semplice.

per il resto te le posso fornire io in cambio di Pajata :D

beninteso, i test di controllo e validazione della routine sono a carico tuo, io porto il vino, però :p

Camacho
04-03-2002, 13:50
beh poi la aggiutso si
ok

a2000
04-03-2002, 13:52
si, quale ? :confused:

a2000
04-03-2002, 13:54
[/siz] :)

Camacho
04-03-2002, 13:56
e come te la faccio la pajata

Camacho
04-03-2002, 13:57
quella che ritieni migliore per me.......

a2000
04-03-2002, 13:58
co a ricetta de a Nonna.

so de bocca buona sa'. nun te preoccupa': magno tutto. :D

a2000
04-03-2002, 14:02
senno' me manni a ricetta via emaile e te passo codice ABI, CAB e conto corente che me arifornisco io. :)

a Camacho, i codici, quelli bboni, stanno a 1 € a riga ! :cool:

a2000
04-03-2002, 14:12
che, te sei perplito ? :(

a2000
04-03-2002, 14:17
me sa che s'è perplito davero. :(

magari è di quartieeree Prati ... mah. :(

Camacho
05-03-2002, 13:26
mica te capisco,ma che stai a di?

a2000
05-03-2002, 13:29
ca++o, alla buon'ora :eek:

te sto a di' che al ristorante almeno lo devi di' er menu' che preferisci. :p

famme sape' in fretta, che tra un po' ve lasso che aricomincio a lavora' sur serio. :cool:

a2000
06-03-2002, 10:58
Camachooooooo
ihuuuuuuu
c'è nessunoooo !

Camacho
08-03-2002, 14:06
Scusami ma ho avuto probloemi con il computer
Sai a me servirebbe una routine di letture che poi applico bene al c++......quindi è meglio la n 2.
Ciao grazie

a2000
08-03-2002, 14:53
eh, no bello: scusa debole. ;)

se vuoi diventare un manager (come vuoi, lo so) devi imparare la:

" .... prima regola del comando: ogni cosa è colpa tua ..."
da "Bugs Life" Dysney-Pixar - 1998

e la seconda regola dice che devi sempre motivare te stesso e chi ti sta intorno e quindi me devi di' che nessuno t'ha proposto una soluzione più fica della mia ;) :D :cool:

Camacho
08-03-2002, 15:52
Proposte meglio della tua non ce ne sono,anche perchè ho parlato solo con te,quindi.non ci ho niente..
Che ne dici della prima proposta?
Ah una cosa ho provato il file in vb che mi hai mandato con un altro benchmark..non funziona come mai..forse le dimensioni?
Ciao

a2000
08-03-2002, 16:13
in generale, non abbiamo problemi di dimensioni ... ;)

funziona, funziona.

se non è più grande di 2Mb (zippato) me lo puoi mandare a:

aa2000@inwind.it

così facciamo un test più realistico.

Guarda che avanzo una [/siz] ;)

verloc
09-03-2002, 15:15
Se non mi trattengo,penso che per la prima volta mi farò cacciare da un forum.
Penso che l'arroganza e i toni usati da qualcuno siano sfuggiti al moderatore.

chippo_
11-03-2002, 10:01
ucci ucci sento odor di lamerucci...:rolleyes:

LordYayo
11-03-2002, 10:07
Nota: questa sezione è nn moderata ma per questo nn vuol dire che si possa dire e fare tutto ciò che si vuole.

Credo che a2000 dovrebbe, come fanno notare oramai diversi utenti, darsi una calmata. Ho letto tutto il thread, ho capito veramente poco perchè nn è il mio campo tecnico questo, ma una cosa è sicura se chiedo al macellaio carne e lui mi da pesce nn mi va bene! Così se chiedo aiuto in C++ e mi si da solo qualche suggerimento che il più delle volte è sterile e criptico in VBA mi sorge il dubbio che mi stanno pigliando per i fondelli.
In più nelle ultime battute sembra quasi che ci sia sott'inteso un'offerta di lavoro: io faccio codice - tu dai soldi... il che nn mi piace per nulla... scrivetevi in privato...

a2000
11-03-2002, 10:59
1) nessuno scambio, è tutto gratis.

2) è stata proposta solo una soluzione diversa che poteva essere accettata o rifiutata.

3) mi sembra ci sia coerenza con il titolo della sezione:
"Discussioni sui principali linguaggi di programmazione; da ASP a C++ passando per Perl e Assembler."

Camacho
11-03-2002, 13:15
Tranquilli non c'è nessuna offerta di lavoro o altro.io chiedevo solo aiuto per la tesi. Mi dispiace se si è generato qualche problema

LordYayo
11-03-2002, 14:50
Originariamente inviato da a2000
[B]1) nessuno scambio, è tutto gratis.

2) è stata proposta solo una soluzione diversa che poteva essere accettata o rifiutata.

3) mi sembra ci sia coerenza con il titolo della sezione:
"Discussioni sui principali linguaggi di programmazione; da ASP a C++ passando per Perl e Assembler."

1) Meglio così

2) Vero. Peccato che l'hai menata per tutto il thread con sto VBA quando la richiesta era per C++

3) Io sono intervenuto perchè diversi utenti mi hanno segnalato il thread, qualcosa secondo loro nn andava... tutto qui. Discuti pure...

lufo
11-03-2002, 15:38
Originariamente inviato da a2000
[B]
3) mi sembra ci sia coerenza con il titolo della sezione:
"Discussioni sui principali linguaggi di programmazione; da ASP a C++ passando per Perl e Assembler."

a me non sembra assolutamente in coerenza con quanto chiesto nel thread.

a2000
11-03-2002, 16:54
grazie lufo, sei un amico. ;)

lufo
11-03-2002, 20:35
Originariamente inviato da a2000
[B]grazie lufo, sei un amico. ;)
no, ti sbagli.

a2000
12-03-2002, 00:31
no.
il migliore amico dell'uomo.
in senso stretto.
con la psicologia tipica del branco.

comunque piano piano si stanno scoperchiando anche i sepolcri imbiancati dalla neve di Cogne.

a2000
12-03-2002, 01:02
Originariamente inviato da Camacho
[B]Tranquilli non c'è nessuna offerta di lavoro o altro.io chiedevo solo aiuto per la tesi. Mi dispiace se si è generato qualche problema

a Camacho, vabbe' che sei de la grande Roma, ma te la cavi proprio con poco. :(
Se devi fare la tesi, esercitati, articola meglio il tuo pensiero: ti ha dato fastidio l'offerta di aiuto alternativa al C++ o ti è servita.
E ti serve ancora o no ? ;)

Camacho
12-03-2002, 13:57
Grazie comunque perchè mi è servita.....ora cerco di riportare quello che mi hai dato in C++
Ciao


p.s. Sono JUVENTINO

a2000
12-03-2002, 14:12
Originariamente inviato da Camacho
[B]Grazie comunque perchè mi è servita.....ora cerco di riportare quello che mi hai dato in C++
Ciao


p.s. Sono JUVENTINO


gli è servita. :)

serviti. ;)



p.s. Mamma mia, e come fai ? :D
allora è vero che sei dei quartieri bene. :p

lufo
12-03-2002, 14:42
Originariamente inviato da a2000
[B]no.
il migliore amico dell'uomo.
in senso stretto.
con la psicologia tipica del branco.

comunque piano piano si stanno scoperchiando anche i sepolcri imbiancati dalla neve di Cogne.
continua pure ad offendere...

a2000
12-03-2002, 14:52
mi dispiace. non mi diverte.

ma penso che un punto di vista diverso in questo campo può essere più prezioso di una ricetta.
anche se a prima vista può sembrare solo 'filosofia'.

se poi incrociare un pò sul serio, un pò per scherzo, il ferro delle opinioni deve diventare un fatto personale ed equivalere a farsi dei "non amici" ...

lufo
12-03-2002, 15:21
se rispondi in maniera inerente a ciò che si chiede nei thread, nulla da dire.
E se magari la smettessi di denigrare sempre o comunque le soluzioni degli altri, molte diatribe inutili, si potrebbero evitare.

a2000
12-03-2002, 15:29
scusa.
ti chiedo scusa. davvero. :(

in bocca al ... lufo. :)

ciao bello.

a2000
12-03-2002, 16:18
Ho visto cose che voi umani non potreste immaginarvi: navi da combattimento in fiamme al largo dei bastioni di Orione....

E ho visto i raggi B balenare nel buio vicino alle porte di Tannoiser.

E tutti quei momenti andranno persi nel tempo come lacrime nella pioggia.

E' tempo di morire.

Luc@s
14-05-2002, 19:32
Originariamente inviato da cionci
Guarda...non è così semplice...anzi...

In pratica quello che vuoi fare si chiama "parsing"...

Ovvero si tratta di riconoscere vari "comandi" e i loro parametri...
Ogni comando ha un suo formato ben preciso...

Ti faccio un esempio...
Leggi un carattere alla volta fino a quando non ottieni in lettura un carattere diverso da una lettera...un ciclo del genere...

char leggiParola(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isalpha(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = 'Originariamente inviato da cionci
Guarda...non è così semplice...anzi...

In pratica quello che vuoi fare si chiama "parsing"...

Ovvero si tratta di riconoscere vari "comandi" e i loro parametri...
Ogni comando ha un suo formato ben preciso...

Ti faccio un esempio...
Leggi un carattere alla volta fino a quando non ottieni in lettura un carattere diverso da una lettera...un ciclo del genere...

char leggiParola(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isalpha(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = '\0'; //carattere di fine stringa...
return tmp;
}

char leggiNumero(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isnumber(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = '\0'; //carattere di fine stringa...
return tmp;
}
.....
.....
....
//comincio leggendo la prima parola
char buffer[1024];
leggiParola(buffer, 1024, f);
//Ora bisogna riconoscere quale comando è stato letto
//Ti faccio un esempio per il comando CELLS
if(!strcmp(parola,"CELLS"))
{
//Abbiamo riconosciuto il comando CELLS
leggiParola(buffer, 2, f);

//buffer[0] ora deve contenere una grafa aperta
if(buffer[0]!='{')
errore(); //Il programma deve terminare all'interno di questa funzione

//a questo punto abbiamo una grafa aperta e ora ci vuole un numero
leggiNumber(buffer, 1024, f);
//Ora dobbiamo aver letto un numero
if(!isnumber(buffer)) errore();
//questa stringa va convertita in un numero con le funzioni atoi o atof
....
}

Insomma tuto funziona così con una bella serie di if...poi è solo un esempi...per rendere più snella la scrittura del codice puoi passare alla funzione leggiParola la parola che vuoi che compaia in modo da far generare l'errore da quella funzione...

Te l'ho detto...non è banale...io in questo modo ci ho scritto un semplice cmpilatore C++... '; //carattere di fine stringa...
return tmp;
}

char leggiNumero(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isnumber(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = 'Originariamente inviato da cionci
Guarda...non è così semplice...anzi...

In pratica quello che vuoi fare si chiama "parsing"...

Ovvero si tratta di riconoscere vari "comandi" e i loro parametri...
Ogni comando ha un suo formato ben preciso...

Ti faccio un esempio...
Leggi un carattere alla volta fino a quando non ottieni in lettura un carattere diverso da una lettera...un ciclo del genere...

char leggiParola(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isalpha(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = '\0'; //carattere di fine stringa...
return tmp;
}

char leggiNumero(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isnumber(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = '\0'; //carattere di fine stringa...
return tmp;
}
.....
.....
....
//comincio leggendo la prima parola
char buffer[1024];
leggiParola(buffer, 1024, f);
//Ora bisogna riconoscere quale comando è stato letto
//Ti faccio un esempio per il comando CELLS
if(!strcmp(parola,"CELLS"))
{
//Abbiamo riconosciuto il comando CELLS
leggiParola(buffer, 2, f);

//buffer[0] ora deve contenere una grafa aperta
if(buffer[0]!='{')
errore(); //Il programma deve terminare all'interno di questa funzione

//a questo punto abbiamo una grafa aperta e ora ci vuole un numero
leggiNumber(buffer, 1024, f);
//Ora dobbiamo aver letto un numero
if(!isnumber(buffer)) errore();
//questa stringa va convertita in un numero con le funzioni atoi o atof
....
}

Insomma tuto funziona così con una bella serie di if...poi è solo un esempi...per rendere più snella la scrittura del codice puoi passare alla funzione leggiParola la parola che vuoi che compaia in modo da far generare l'errore da quella funzione...

Te l'ho detto...non è banale...io in questo modo ci ho scritto un semplice cmpilatore C++... '; //carattere di fine stringa...
return tmp;
}
.....
.....
....
//comincio leggendo la prima parola
char buffer[1024];
leggiParola(buffer, 1024, f);
//Ora bisogna riconoscere quale comando è stato letto
//Ti faccio un esempio per il comando CELLS
if(!strcmp(parola,"CELLS"))
{
//Abbiamo riconosciuto il comando CELLS
leggiParola(buffer, 2, f);

//buffer[0] ora deve contenere una grafa aperta
if(buffer[0]!='{')
errore(); //Il programma deve terminare all'interno di questa funzione

//a questo punto abbiamo una grafa aperta e ora ci vuole un numero
leggiNumber(buffer, 1024, f);
//Ora dobbiamo aver letto un numero
if(!isnumber(buffer)) errore();
//questa stringa va convertita in un numero con le funzioni atoi o atof
....
}

Insomma tuto funziona così con una bella serie di if...poi è solo un esempi...per rendere più snella la scrittura del codice puoi passare alla funzione leggiParola la parola che vuoi che compaia in modo da far generare l'errore da quella funzione...

Te l'ho detto...non è banale...io in questo modo ci ho scritto un semplice cmpilatore C++...

Interessante:rolleyes:, si potrebbe avere un server da dove skarikare sto compilatore tuo?

cionci
15-05-2002, 10:23
Era un progetto per un esame...niente di eccezionale...le funzionalità supportate sono poschissime... Tra l'altro è anche scritto in maniera pessima :)

Luc@s
15-05-2002, 14:28
sono curioso lo stesso:o


Potresti dirmi dove skarikare il prog fatto e i sorgenti??????????




P.S: sei un grande:cool:

cionci
15-05-2002, 15:39
Originariamente inviato da Luc@s
[B]Potresti dirmi dove skarikare il prog fatto e i sorgenti??????????

:D :D :D
L'ho fatto in Borland Turbo C 4 anni fa...non so nemmeno se riuscirò a trovarlo...
Devo sentire l'altra persona che ci ha lavorato con me perchè credo di averlo perso...

Comunque accettava solo un tipo (interi a 16 bit)...le funzioni (quindi passaggio di variabili, possibilità di fare ricorsione etc. etc.)...scope locali (le variabili erano visibili solo all'interno del blocco in cui erano state dichiarate) e globali...for e if per il controlle del flusso...chiaramente i vari operatori aritmetici e logici...e poi ci avevo messo una funzione di input e una di output per gli interi...

Generava un sorgente assembly compilabile con il TASM (Turbo Assembler di Borland)...