Problema prelievo lista da file

di il
3 risposte

Problema prelievo lista da file

Ciao a tutti ragazzi!!!
Probabilmente dal titolo si è capito ben poco, quindi mi spiego subito.
Ho scritto un programma che fa quanto segue:
-Preleva dei numeri messi a caso da un file "listin" e li inserisce in una lista ordinata;
-Preleva da un file "listdel" dei numeri e li cancella dalla lista, se sono presenti
-Scrive in un file "newlist" la lista ordinata e priva dei numeri prelevati da listdel e cancellati;
Questo è il codice:

#include<iostream>
#include<fstream>
using namespace std;
struct nodo{
	int info;
	nodo *next;
};
#include"myfunc"

int main(){
	nodo *head=NULL;
	int x;
	ifstream listin("listin.txt");
	ifstream listdel("listdel.txt");
	ofstream newlist("newlist.txt");
	//leggo i dati da listin e creo la lista
	while(!listin.eof()){
		listin>>x;
		nodo *nuovo;
		nuovo=new nodo;
		nuovo->info=x;
		inserisci_ord(head,nuovo);
	}
	//stampo la lista ordinata
	stampa_lista(head);
	//elimino i nodi  con il campo info uguale ai numeri di listdel
	while(!listdel.eof()){
		listdel>>x;
		elimina_nodo(head,x);
	}
	//scrivo la lista sul file newlist
	nodo *first;
	first=head;
	while(first!=NULL){
		x=first->info;
		newlist<<x<<" ";
		first=first->next;	
	}
	
	

	return 0;
}
queste invece sono le funzioni che ho implementato:

void inserisci_ord(nodo *&head,nodo *&nuovo){
	if(head==NULL||head->info>=nuovo->info){
		nuovo->next=head;
		head=nuovo;
	}else{
		inserisci_ord(head->next,nuovo);
	}
}


void elimina_nodo(nodo *&head,int x){
	if(head==NULL)
		return;
	else{
		if(head->info==x){
			head=head->next;
		}else{
			elimina_nodo(head->next,x);
		}
	}
}


void stampa_lista(nodo *first){
	cout<<"La lista e'"<<endl;
	while(first!=NULL){
		cout<<first->info<<endl;
		first=first->next;
	}
}
Il file listin.txt è:

23 56 88 90 13 27 29 74 87 110 135 19 92 68 77
Il file listdel.txt e':

88 87 135 
il file newlist.txt dopo l'esecuzione del programma è:

13 19 23 27 29 56 68 74 77 77 90 92 110 
Detto questo vi spiego il problema. In pratica succede che l'ultimo elemento che viene prelevato dal file "listin.txt", viene inserito due volte nella lista. Infatti con i dati che vi ho postato, se stampo la lista (e come potete vedere anche da ciò che viene scritto nel file "newlist.txt") il numero 77, che è l'ultimo del file "listin.txt" viene inserito 2 volte nella lista. Così mi verrebbe da dire che si tratta di qualche problema legato al !listin.eof(), ma non ne ho la minima idea. Qualcuno riesce ad aiutarmi?
P.s. la funzione di inserimento non mi da problemi...se inserisco i valori direttamente dal programma la lista viene creata correttamente. Il problema si verifica solo se prelevo i dati da un file, e solo con l'ultimo numero del file... Grazie

3 Risposte

  • Re: Problema prelievo lista da file

    Non usare la eof nella while ma riscrivi così

    while(listin >> x){

    ovviamente eliminando la riga successiva
  • Re: Problema prelievo lista da file

    oregon ha scritto:


    Non usare la eof nella while ma riscrivi così

    while(listin >> x){

    ovviamente eliminando la riga successiva
    Grazie mille! Ho appena trovato un'altro modo per risolvere... lo posto che magari può tornare utile a qualcuno.
    In pratica basta mettere un listin>>x prima del cicli while e poi spostare il listin>>x alla fine del ciclo while:
    
       listin>>x;
       while(!listin.eof()){
          nodo *nuovo;
          nuovo=new nodo;
          nuovo->info=x;
          inserisci_ord(head,nuovo);
          listin>>x;
       }
    
  • Re: Problema prelievo lista da file

    E' un modo più complicato di fare la stessa cosa che ti avevo suggerito ... ma de gustibus ...
Devi accedere o registrarti per scrivere nel forum
3 risposte