Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.
1 ώρα πριν, matheostsik είπε

 


        if( feof(fp) ) { 
         break ;}

image.png.9e47de15d37783aa74af61eaa8f87874.png

 

48 λεπτά πριν, matheostsik είπε

Το προβλημα ειναι οτι "ξαναfreadarei" ενω το αρχειο τελειωνει στην δευτερη γραμμη.(η καθε γραμμη κανονικα περιεχει: int(που δεν εμφανιζεται) ,string, int,float.

 

1 λεπτό πριν, kaliakman είπε

Μήπως εδώ είναι το πρόβλημα σου? Όταν φτιάχνεις το αρχείο το έχεις ανοίξει να το δεις; Είναι καλά γραμμένο; Δηλαδή η τελευταία γραμμή είναι όντως αυτό που θες;

Εγώ ποντάρω τα λεφτά μου στο feof -> break. Ποτέ δεν χρησιμοποιούμε τα EOF, feof με τέτοιο τρόπο γιατί οδηγούμαστε σε τέτοια προβλήματα. Για να γίνει trigger η feof πρέπει να διαβάσεις πέρα από το τέλος του αρχείου. Όταν όμως διαβάσεις την δεύτερη γραμμή, αυτό δεν έχει γίνει ακόμη οπότε το loop τρέχει για ακόμη μια φορά και η addtobeg / addtoend εισάγει ό,τι σκουπίδια υπάρχουν από την προηγούμενη εκτέλεση. Το όνομα λογικά δεν γράφεται λόγω του free ή κάτι τέτοιο.

  • Like 2
Δημοσ.

Το αρχείο είναι έτοιμο αλλά μήπως το "χάλασες" όταν έτρεξες το πρόγραμμα σου; Δες το αρχείο πριν και μόλις τελειώσει το πρόγραμμα σου.

Δημοσ. (επεξεργασμένο)
3 λεπτά πριν, imitheos είπε

Εγώ ποντάρω τα λεφτά μου στο feof -> break. Ποτέ δεν χρησιμοποιούμε τα EOF, feof με τέτοιο τρόπο γιατί οδηγούμαστε σε τέτοια προβλήματα. Για να γίνει trigger η feof πρέπει να διαβάσεις πέρα από το τέλος του αρχείου. Όταν όμως διαβάσεις την δεύτερη γραμμή, αυτό δεν έχει γίνει ακόμη οπότε το loop τρέχει για ακόμη μια φορά και η addtobeg / addtoend εισάγει ό,τι σκουπίδια υπάρχουν από την προηγούμενη εκτέλεση. Το όνομα λογικά δεν γράφεται λόγω του free ή κάτι τέτοιο.

Οχι το αρχειο περιεχει 2 εγγραφες σιγουρα.

2 λεπτά πριν, kaliakman είπε

Το αρχείο είναι έτοιμο αλλά μήπως το "χάλασες" όταν έτρεξες το πρόγραμμα σου; Δες το αρχείο πριν και μόλις τελειώσει το πρόγραμμα σου.

Αφου αρχικα το ανοιγω με "rb" αρα δεν μπορω να το επεξεργαστω ,επισης δεν εχω καμια fwrite στο συγκεκριμενο προγραμμα.

Επεξ/σία από matheostsik
Δημοσ.
3 λεπτά πριν, matheostsik είπε

Οχι το αρχειο περιεχει 2 εγγραφες σιγουρα.

Αφου αρχικα το ανοιγω με "rb" αρα δεν μπορω να το επεξεργαστω ,επισης δεν εχω καμια fwrite στο συγκεκριμενο προγραμμα.

Διάβασε ξανά αυτό που έγραψα. Το αρχείο φυσικά περιέχει 2 εγγραφές. Ο κώδικάς σου είναι λάθος

>
	% ./a.out
Trexo gia 0 fora
The Godfather 1972 245066416.00
H feof epepstrepse 0
Trexo gia 1 fora
Snatch 2000 30093108.00
H feof epepstrepse 0
Trexo gia 2 fora
 2000 30093108.00
H feof epepstrepse 1
	

Όταν έχει τελειώσει το διάβασμα της 2ης γραμμής και τρέξει ο έλεγχος με την feof, η feof ΔΕΝ επιστρέφει 1 γιατί ΔΕΝ έχεις περάσει το τέλος του αρχείου ακόμη. Για να επιστρέψει 1 η feof πρέπει να διαβάσεις πέρα από το τέλος του αρχείου. Εσύ έχεις διαβάσει μέχρι και το τελευταίο byte αλλά όχι ΠΈΡΑ από το τέλος. Για αυτό το λόγο ο βρόχος σου τρέχει ακόμη μία φορά αλλά φυσικά όλες οι fread αποτυγχάνουν γιατί δεν έχει κάτι άλλο στο αρχείο. Η feof αρχίζει να επιστρέφει 1 μετά την εκτέλεση της fread(&len).

Είναι κλασικό λάθος που κάνουν όλη στη C. Απλά πρέπει να αλλάξεις την συνθήκη τερματισμού του βρόχου και να μην χρησιμοποιείς την feof με τέτοιο τρόπο και το πρόβλημα θα λυθεί.

  • Like 1
Δημοσ.
2 λεπτά πριν, imitheos είπε

Είναι κλασικό λάθος που κάνουν όλη στη C. Απλά πρέπει να αλλάξεις την συνθήκη τερματισμού του βρόχου και να μην χρησιμοποιείς την feof με τέτοιο τρόπο και το πρόβλημα θα λυθεί.

Καταλαβα,σκεφτηκα επισης να ξανακανω fread πριν κλεισει ο βροχος και να ελεγξω την τιμη της fread?Τι λετε?

Δημοσ.

Απλά να προσθέσω ότι ανεξάρτητα σε τι περιβάλλον γράφεις να έχεις πάντα διαθέσιμο debugger έστω και τον gdb. Το συγκεκριμένο λάθος θα το είχες καταλάβει σε 2 λεπτά πραγματικά αλλά και γενικότερα βοηθάει πάρα πολύ.

Δημοσ.
Μόλις τώρα, kaliakman είπε

Απλά να προσθέσω ότι ανεξάρτητα σε τι περιβάλλον γράφεις να έχεις πάντα διαθέσιμο debugger έστω και τον gdb. Το συγκεκριμένο λάθος θα το είχες καταλάβει σε 2 λεπτά πραγματικά αλλά και γενικότερα βοηθάει πάρα πολύ.

To gdb ηξερα να το χρησιμοποιω οταν τυχαινει Seg fault ,δεν ηξερα οτι μπορει να βοηθησει σε λογικο λαθος.

Δημοσ.
2 λεπτά πριν, matheostsik είπε

To gdb ηξερα να το χρησιμοποιω οταν τυχαινει Seg fault ,δεν ηξερα οτι μπορει να βοηθησει σε λογικο λαθος.

Μπορείς να το χρησιμοποιήσεις και για να δεις τιμές διάφορων μεταβλητών καθώς και απλά να δεις πως τρέχει το πρόγραμμα σου. Εδώ πχ θα μπορούσες να δείς ότι η feof δεν σου επέστρεψε αυτό που έπρεπε επείδη θα συνέχιζε για μια ακόμα επανάληψη.

Δημοσ.

Παιδια κομπλε το εφτιαξα αυτο το προβλημα.

while(fread(&len,sizeof(int),1,fp)==1){
	    /*Anoigma arxeiou + dhmiourgia listas*/
		//fread(&len,sizeof(int),1,fp);
		name=malloc(len*sizeof(char));
		fread(name,len*sizeof(char),1,fp);
		fread(&year,sizeof(int),1,fp);
		fread(&funds,sizeof(float),1,fp);

		if(start==NULL){
		    start = addatbeg(start,len,name,year,funds);
		  }else{
	 	    addatend(start,len,name,year,funds);}    
        
        free(name); 
        

    }

Παω να δοκιμασω τις λειτουργιες και υστερα το write.

Προς το παρων δε δουλευει το reset (που θα επρεπε να τις διαγραφει ολες τις εγγραφες αλλα διαγραφει μονο μια) ουτε το add που θα επρεπε να αυξανει το start->funds

Δημοσ.
28 λεπτά πριν, matheostsik είπε

		if(start==NULL){
		    start = addatbeg(start,len,name,year,funds);
		  }else{
	 	    addatend(start,len,name,year,funds);}    

 

 

Γιατί δεν βάζεις αυτό τον έλεγχο μέσα στη συνάρτηση και να έχεις μία συνάρτηση αντί για δύο που κάνουν κατά το 90% το ίδιο πράγμα ?

Δημοσ.
Μόλις τώρα, imitheos είπε

Γιατί δεν βάζεις αυτό τον έλεγχο μέσα στη συνάρτηση και να έχεις μία συνάρτηση αντί για δύο που κάνουν κατά το 90% το ίδιο πράγμα ?

Αφου δουλευει ετσι προτιμω πρωτα να διορθωσω καποια πραγματα που δεν δουλευουν και μετα να φτιαξω αυτα.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...