matheostsik Δημοσ. 22 Ιανουαρίου 2018 Μέλος Δημοσ. 22 Ιανουαρίου 2018 Ειναι ετοιμο αρχειο απο την εκφωνηση.Η εξοδος που εχω παραθεσει παραπανω θα επρεπε να ειναι σαν την πρωτη απο το λινκ. http://www.csd.uoc.gr/~hy100/hw5-example.txt
imitheos Δημοσ. 22 Ιανουαρίου 2018 Δημοσ. 22 Ιανουαρίου 2018 1 ώρα πριν, matheostsik είπε if( feof(fp) ) { break ;} 48 λεπτά πριν, matheostsik είπε Το προβλημα ειναι οτι "ξαναfreadarei" ενω το αρχειο τελειωνει στην δευτερη γραμμη.(η καθε γραμμη κανονικα περιεχει: int(που δεν εμφανιζεται) ,string, int,float. 1 λεπτό πριν, kaliakman είπε Μήπως εδώ είναι το πρόβλημα σου? Όταν φτιάχνεις το αρχείο το έχεις ανοίξει να το δεις; Είναι καλά γραμμένο; Δηλαδή η τελευταία γραμμή είναι όντως αυτό που θες; Εγώ ποντάρω τα λεφτά μου στο feof -> break. Ποτέ δεν χρησιμοποιούμε τα EOF, feof με τέτοιο τρόπο γιατί οδηγούμαστε σε τέτοια προβλήματα. Για να γίνει trigger η feof πρέπει να διαβάσεις πέρα από το τέλος του αρχείου. Όταν όμως διαβάσεις την δεύτερη γραμμή, αυτό δεν έχει γίνει ακόμη οπότε το loop τρέχει για ακόμη μια φορά και η addtobeg / addtoend εισάγει ό,τι σκουπίδια υπάρχουν από την προηγούμενη εκτέλεση. Το όνομα λογικά δεν γράφεται λόγω του free ή κάτι τέτοιο. 2
kaliakman Δημοσ. 22 Ιανουαρίου 2018 Δημοσ. 22 Ιανουαρίου 2018 Το αρχείο είναι έτοιμο αλλά μήπως το "χάλασες" όταν έτρεξες το πρόγραμμα σου; Δες το αρχείο πριν και μόλις τελειώσει το πρόγραμμα σου.
matheostsik Δημοσ. 22 Ιανουαρίου 2018 Μέλος Δημοσ. 22 Ιανουαρίου 2018 (επεξεργασμένο) 3 λεπτά πριν, imitheos είπε Εγώ ποντάρω τα λεφτά μου στο feof -> break. Ποτέ δεν χρησιμοποιούμε τα EOF, feof με τέτοιο τρόπο γιατί οδηγούμαστε σε τέτοια προβλήματα. Για να γίνει trigger η feof πρέπει να διαβάσεις πέρα από το τέλος του αρχείου. Όταν όμως διαβάσεις την δεύτερη γραμμή, αυτό δεν έχει γίνει ακόμη οπότε το loop τρέχει για ακόμη μια φορά και η addtobeg / addtoend εισάγει ό,τι σκουπίδια υπάρχουν από την προηγούμενη εκτέλεση. Το όνομα λογικά δεν γράφεται λόγω του free ή κάτι τέτοιο. Οχι το αρχειο περιεχει 2 εγγραφες σιγουρα. 2 λεπτά πριν, kaliakman είπε Το αρχείο είναι έτοιμο αλλά μήπως το "χάλασες" όταν έτρεξες το πρόγραμμα σου; Δες το αρχείο πριν και μόλις τελειώσει το πρόγραμμα σου. Αφου αρχικα το ανοιγω με "rb" αρα δεν μπορω να το επεξεργαστω ,επισης δεν εχω καμια fwrite στο συγκεκριμενο προγραμμα. Επεξ/σία 22 Ιανουαρίου 2018 από matheostsik
imitheos Δημοσ. 22 Ιανουαρίου 2018 Δημοσ. 22 Ιανουαρίου 2018 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 με τέτοιο τρόπο και το πρόβλημα θα λυθεί. 1
matheostsik Δημοσ. 22 Ιανουαρίου 2018 Μέλος Δημοσ. 22 Ιανουαρίου 2018 2 λεπτά πριν, imitheos είπε Είναι κλασικό λάθος που κάνουν όλη στη C. Απλά πρέπει να αλλάξεις την συνθήκη τερματισμού του βρόχου και να μην χρησιμοποιείς την feof με τέτοιο τρόπο και το πρόβλημα θα λυθεί. Καταλαβα,σκεφτηκα επισης να ξανακανω fread πριν κλεισει ο βροχος και να ελεγξω την τιμη της fread?Τι λετε?
kaliakman Δημοσ. 22 Ιανουαρίου 2018 Δημοσ. 22 Ιανουαρίου 2018 Απλά να προσθέσω ότι ανεξάρτητα σε τι περιβάλλον γράφεις να έχεις πάντα διαθέσιμο debugger έστω και τον gdb. Το συγκεκριμένο λάθος θα το είχες καταλάβει σε 2 λεπτά πραγματικά αλλά και γενικότερα βοηθάει πάρα πολύ.
matheostsik Δημοσ. 22 Ιανουαρίου 2018 Μέλος Δημοσ. 22 Ιανουαρίου 2018 Μόλις τώρα, kaliakman είπε Απλά να προσθέσω ότι ανεξάρτητα σε τι περιβάλλον γράφεις να έχεις πάντα διαθέσιμο debugger έστω και τον gdb. Το συγκεκριμένο λάθος θα το είχες καταλάβει σε 2 λεπτά πραγματικά αλλά και γενικότερα βοηθάει πάρα πολύ. To gdb ηξερα να το χρησιμοποιω οταν τυχαινει Seg fault ,δεν ηξερα οτι μπορει να βοηθησει σε λογικο λαθος.
kaliakman Δημοσ. 22 Ιανουαρίου 2018 Δημοσ. 22 Ιανουαρίου 2018 2 λεπτά πριν, matheostsik είπε To gdb ηξερα να το χρησιμοποιω οταν τυχαινει Seg fault ,δεν ηξερα οτι μπορει να βοηθησει σε λογικο λαθος. Μπορείς να το χρησιμοποιήσεις και για να δεις τιμές διάφορων μεταβλητών καθώς και απλά να δεις πως τρέχει το πρόγραμμα σου. Εδώ πχ θα μπορούσες να δείς ότι η feof δεν σου επέστρεψε αυτό που έπρεπε επείδη θα συνέχιζε για μια ακόμα επανάληψη.
matheostsik Δημοσ. 22 Ιανουαρίου 2018 Μέλος Δημοσ. 22 Ιανουαρίου 2018 Παιδια κομπλε το εφτιαξα αυτο το προβλημα. 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
imitheos Δημοσ. 22 Ιανουαρίου 2018 Δημοσ. 22 Ιανουαρίου 2018 28 λεπτά πριν, matheostsik είπε if(start==NULL){ start = addatbeg(start,len,name,year,funds); }else{ addatend(start,len,name,year,funds);} Γιατί δεν βάζεις αυτό τον έλεγχο μέσα στη συνάρτηση και να έχεις μία συνάρτηση αντί για δύο που κάνουν κατά το 90% το ίδιο πράγμα ?
matheostsik Δημοσ. 22 Ιανουαρίου 2018 Μέλος Δημοσ. 22 Ιανουαρίου 2018 Μόλις τώρα, imitheos είπε Γιατί δεν βάζεις αυτό τον έλεγχο μέσα στη συνάρτηση και να έχεις μία συνάρτηση αντί για δύο που κάνουν κατά το 90% το ίδιο πράγμα ? Αφου δουλευει ετσι προτιμω πρωτα να διορθωσω καποια πραγματα που δεν δουλευουν και μετα να φτιαξω αυτα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα