Newsgroup: it.comp.lang.c++
Titolo: importazione dati da file di testo

Ho costruito 2 versioni di una funzione per importare dei dati da un
file di testo "Postazioni.txt" che contiene dei record ognuno dei
quali memorizza i seguenti campi relativi ad un computer:
-caratteristiche tecniche
-sistema operativo
-id della postazione
-stato attuale (libero, inagibile, occupato)
I campi sono separati da '\t' e i record da '\n'.
Un esempio di file di testo è:
Intel Pentium IV	Windows Me	1	libero
Amd Duron 850	Windows 98	2	libero
Amd Athlon 1200	Windows Xp	3	libero
Intel Pentium IV	Windows Me	4	libero
Amd Thunderbird	Windows Nt	5	libero
La prima versione è questa:
//==================================================
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
using namespace std;
bool CaricaPostazioni(char* nomeFile){
	ifstream inFile;
	inFile.open(nomeFile);
	if (!inFile) return false;	//errore in apertura
	string carTec;
	string sisOp;
	string s;
	int idPos;
	string stato;
	while(!inFile.eof()){
		getline(inFile,carTec,'\t');
		carTec.resize(carTec.length()-1);
		getline(inFile,sisOp,'\t');
		sisOp.resize(sisOp.length()-1);
		getline(inFile,s);
		istringstream si;
		si.str("");
		si.str(s);
		si>>idPos>>stato;
		if (
stato.at
(stato.length()-1)=='\0')
			stato.resize(stato.length()-1);
cout<<carTec<<";"<<sisOp<<";"<<idPos<<";"<<stato<<'\n'; //in realtà
faccio altre cose dopo,
//ma ho messo questa riga per verifica
	}
	return true;
}
main(){
	CaricaPostazioni("Postazioni.txt");
}
//==================================================
La seconda versione è questa:
//==================================================
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
using namespace std;
bool CaricaPostazioni(char* nomeFile){
	ifstream inFile;
	inFile.open(nomeFile);
	if (!inFile) return false;	//errore in apertura
	string s;
	string carTec;
	string sisOp;
	int idPos;
	string stato;
	int inizio;
	int fine;
	while(getline(inFile,s)){
		inizio=0;
		fine=s.find('\t');
		carTec=s.substr(inizio,fine-inizio);
		inizio=fine+1;
		fine=s.find('\t',fine+1);
		sisOp=s.substr(inizio,fine-inizio);
		inizio=fine+1;
		fine=s.find('\n',fine+1);
		istringstream si(s.substr(inizio,fine-inizio));
		si>>idPos>>stato;
		if (
stato.at
(stato.length()-1)=='\0')
			stato.resize(stato.length()-1);
cout<<carTec<<";"<<sisOp<<";"<<idPos<<";"<<stato<<'\n'; //in realtà
faccio altre cose dopo,
//ma ho messo questa riga per verifica
	}
	return true;
}
main(){
	CaricaPostazioni("Postazioni.txt");
}
//==================================================
Entrambe funzionano
Secondo voi qual è la versione migliore? La prima mi sembra più
leggibile, ma gradirei i vostri commenti.
Esiste un modo migliore per svolgere questo compito?
Un'ultima domanda: perchè getline aggiunge alla stringa il carattere
di fine stringa, come se fosse un array di caratteri?
Non c'è un modo per evitare di fargli aggiungere quel carattere, ed
evitare di fare il resize della stringa? 
Nell' help del compilatore (Borland C++ 5.5) c'è scritto:
basic_istream<charT, traits> getline(basic_istream<charT, traits> is,
<charT, traits allocator> str, charT delim);
An unformatted input function that extracts characters from is into
str until npos - 1 characters are read, the end of the input sequence
is reached, or the character read is delim. The characters are read
using traits::char_in(). 
Per esempio, 
#include <iostream>
#include <string>
using namespace std;
main(){
	string r;
	cin>>r;
	cout<<r<<r.length()<<'\n';
	string t;
	getline(cin,t);
	cout<<t<<t.length()<<'\n';
}
se inserisco la stessa stringa, ad esempio "ciao", nel primo caso in
output ho
ciao4
e nel secondo caso
ciao 5
Grazie per l'attenzione e scusate la prolissità (si dice così?)
RiBeZ

 file://==================================================


 facendo direi di si...oppure è un caso:-))
il quoting... questo sconosciuto...
http://it.geocities.com/usenetitalia/quoting.html
http://www.uwasa.fi/~ts/http/quote.html
 (inglese)
--
Gerolamo

> Ho costruito 2 versioni di una funzione per importare dei dati da un
proprio così
stavo cercando di perfezionare l'homework 4 con nuove funzioni per
esercitarmi
hai fatto il primo appello?

 ha scritto nel messaggio
news:3d2614f3...@powernews.inwind.it...


scusate se non ho, di nuovo, rispettato le modalitą di risposta nei
ng...pardon