[Risolto][C++] Scrittura in File

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

[Risolto][C++] Scrittura in File

Messaggio da JhW »

Salve a tutti,
questo codice dovrebbe copiare il contenuto del file ElencoMerci.txt nel file prova.txt
ecco il codice:

Codice: Seleziona tutto

#include <iostream>
#include <fstream>

using namespace std;
struct merce
{
	char tipologia[30];
	char codice[5];
	char quantita[20];
};

int main()
{
	fstream file, file2;
	merce merce;
	char boh[30];

	file2.open("prova.txt", ios::out);
	file.open("ElencoMerci.txt", ios::in);
	if(!file)
	{
		cerr << "Errore nell'apertura del file";
		return -1;
	}

	while(!file.eof())
	{
		file.getline(merce.tipologia, sizeof(merce.tipologia), ';');
		file.ignore(1);
		file.getline(merce.codice, sizeof(merce.codice), ';');
		file.ignore(1);
		file.getline(merce.quantita, sizeof(merce.quantita), ';');
		file.ignore(1);
		cout << merce.tipologia << endl;
		cout << merce.codice << endl;
		cout << merce.quantita << endl << endl;
		cout << "------------------" << endl;
		file2.write(merce.tipologia, sizeof(merce.tipologia));
		file2.write(merce.codice, sizeof(merce.codice));
		file2.write(merce.quantita, sizeof(merce.quantita));
		file2.put('\n');
	}

	file2.close();
	file.close();


	return 0;
}
il problema è che nel file prova.txt viene scritta solo la stringa merce.tipologia.

Credo che il problema sia nel write.. non so.. va utilizzato diversamente?
Ultima modifica di JhW il domenica 22 giugno 2014, 16:54, modificato 1 volta in totale.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++] Scrittura in File

Messaggio da 1001001 »

Ciao! Tralasciando per un momento il fatto che usare feof per il controllo di fine lettura non è una buona cosa (http://faq.cprogramming.com/cgi-bin/sma ... 1043284351), ho una domanda da farti a monte di tutto. Perché non usare un int per codice e quantità e una std::string per tipologia? In questo modo, oltre ad essere più corretto semanticamente, sarebbe tutto più facile, compreso il fatto che potresti scrivere semplicemente usando l'operator <<:

Codice: Seleziona tutto

file2 << merce.tipologia << merce.codice << merce.quantita << std::endl;
Detto questo, se per qualche motivo vuoi continuare sulla strada che hai intrapreso, posta per favore un esempio di file ElencoMerci.txt
"I find your lack of faith disturbing."
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

Re: [C++] Scrittura in File

Messaggio da JhW »

1001001 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4604084#p4604084][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Ciao! Tralasciando per un momento il fatto che usare feof per il controllo di fine lettura non è una buona cosa (http://faq.cprogramming.com/cgi-bin/sma ... 1043284351), ho una domanda da farti a monte di tutto. Perché non usare un int per codice e quantità e una std::string per tipologia? In questo modo, oltre ad essere più corretto semanticamente, sarebbe tutto più facile, compreso il fatto che potresti scrivere semplicemente usando l'operator <<:

Codice: Seleziona tutto

file2 << merce.tipologia << merce.codice << merce.quantita << std::endl;
Detto questo, se per qualche motivo vuoi continuare sulla strada che hai intrapreso, posta per favore un esempio di file ElencoMerci.txt
Ciao, innanzitutto grazie per la risposta.
l'operatore "<<" l'ho già provato e mi scrive il file correttamente.
Invece di limitarmi a usare l'operaratore "<<" vorrei capire perché il write non fa esattamente lo stesso lavoro :muro:
Ecco l'out del programma che ho postato sopra:

ElencoMerci.txt
Casse Stereo; 7931; 8;
Computer; 8246; 50;
Smartphone; 7135; 85;
Olio Motore; 3231; 88;

prova.txt
Casse Stereo
Computer
Smartphone
Olio Motore

trascurando i ';' che ho deciso di non copiarli, perché merce.codice e merce.quantita non vengono copiati?
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++] Scrittura in File

Messaggio da 1001001 »

Il problema con il tuo codice è che quando stampi con la funzione write gli dici di stampare un numero di caratteri pari alla dimensione in byte delle variabili tipologia, codice e quantita. Questo ha due problemi:
1) stai usando la dimensione in byte invece del numero di elementi dell'array. In questo caso funziona perché tipicamente un char ha dimensione un byte, ma non è esattamente una soluzione pulita
2) quando leggi da file con getline, l'array di caratteri in generale è più grande della stringa che leggi. Questo vuol dire che ci sono dei caratteri nell'array dopo la fine della stringa che non sono stati inizializzati e possono contenere più o meno qualunque cosa, e tu glieli fai stampare. Se infatti limiti il numero di caratteri stampati a, ad esempio, 2 vedrai che stampa i primi due caratteri di tutte quante le variabili che fai stampare
"I find your lack of faith disturbing."
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

Re: [C++] Scrittura in File

Messaggio da JhW »

1001001 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4604185#p4604185][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Il problema con il tuo codice è che quando stampi con la funzione write gli dici di stampare un numero di caratteri pari alla dimensione in byte delle variabili tipologia, codice e quantita. Questo ha due problemi:
1) stai usando la dimensione in byte invece del numero di elementi dell'array. In questo caso funziona perché tipicamente un char ha dimensione un byte, ma non è esattamente una soluzione pulita
2) quando leggi da file con getline, l'array di caratteri in generale è più grande della stringa che leggi. Questo vuol dire che ci sono dei caratteri nell'array dopo la fine della stringa che non sono stati inizializzati e possono contenere più o meno qualunque cosa, e tu glieli fai stampare. Se infatti limiti il numero di caratteri stampati a, ad esempio, 2 vedrai che stampa i primi due caratteri di tutte quante le variabili che fai stampare
ho fatto la prova dei 2 caratteri che hai detto ed effettivamente funziona.. ma il write non dovrebbe fermarsi al carattere '\0'?
come mi consigli di sistemare il programma?
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++] Scrittura in File

Messaggio da 1001001 »

Amoroso2687 ha scritto:ma il write non dovrebbe fermarsi al carattere '\0'?
No:
This function simply copies a block of data, without checking its contents: The array may contain null characters, which are also copied without stopping the copying process.
(http://www.cplusplus.com/reference/ostr ... /?kw=write)


Amoroso2687 ha scritto:come mi consigli di sistemare il programma?
Mantenendo la funzione write, come minimo sostituirei gli array di char con std::string. A quel punto puoi usare il metodo size() per sapere quanti caratteri stampare con write. Se proprio vuoi usare le stringhe C-like, l'unica soluzione che mi viene in mente è questa:

Codice: Seleziona tutto

#include <iostream>
#include <fstream>

using namespace std;
struct merce
{
   char tipologia[30];
   char codice[5];
   char quantita[20];
};

int main()
{
   fstream file, file2;
   merce merce;

   file2.open("prova.txt", ios::out);
   file.open("ElencoMerci.txt", ios::in);
   if(!file)
   {
      cerr << "Errore nell'apertura del file";
      return -1;
   }

   while(!file.eof())
   {
      file.getline(merce.tipologia, sizeof(merce.tipologia), ';');
      file.ignore(1);
      file.getline(merce.codice, sizeof(merce.codice), ';');
      file.ignore(1);
      file.getline(merce.quantita, sizeof(merce.quantita), ';');
      file.ignore(1);
      for (int i = 0; i < 30 && merce.tipologia[i] != '\0'; i++)
      {
          file2.write(&merce.tipologia[i], 1);
      }
      file2.put(' ');
      for (int i = 0; i < 5 && merce.codice[i] != '\0'; i++)
      {
          file2.write(&merce.codice[i], 1);
      }
      file2.put(' ');
      for (int i = 0; i < 20 && merce.quantita[i] != '\0'; i++)
      {
          file2.write(&merce.quantita[i], 1);
      }
      file2.put('\n');
   }

   file2.close();
   file.close();

   return 0;
}
(sempre con il caveat che il controllo con feof() non va bene...)
"I find your lack of faith disturbing."
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

Re: [C++] Scrittura in File

Messaggio da JhW »

Grazie mille per l'aiuto! :)
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [Risolto][C++] Scrittura in File

Messaggio da 1001001 »

Di niente! :)
Se hai risolto ricordati di aggiungere "[Risolto]" al titolo del primo messaggio per favore.

Ciao! :ciao:

EDIT: errore mio, non mi ero accorto che l'avevi già messo :D
"I find your lack of faith disturbing."
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti