deninho Δημοσιεύτηκε Δεκέμβριος 17, 2014 #1 Κοινοποίηση Δημοσιεύτηκε Δεκέμβριος 17, 2014 Χρειάζομαι μια επανάληψη, που κάθε φορά θα διαβάζει από ένα αρχείο έχω γράψει:while (!feof(fp)){fscanf(fp, "%Ld", &cc_n);printf("%Ld", cc_n);}Και το τελευταίο στοιχείο (ένας αριθμός ανά γραμμή) του αρχείου το τυπώνει 2 φορές. Το ίδιο συμβαίνει όταν περνάω τη μεταβλητή cc_n στη συνάρτησή μου. Καμιά ιδέα για το που είναι το λάθος; Υπ'όψιν, δε γνωρίζω το πόσα στοιχεία θα έχει το αρχείο μου Link to comment Share on other sites More sharing options...
nucleus Δεκέμβριος 17, 2014 #2 Κοινοποίηση Δεκέμβριος 17, 2014 (edited) http://www.cplusplus.com/reference/cstdio/fscanf/If a reading error happens or the end-of-file is reached while reading, the proper indicator is set (feof or ferror). And, if either happens before any data could be successfully read, EOF is returned. Δοκίμασε αυτόwhile (fscanf(fp, "%Ld", &cc_n) != EOF) { printf("%Ld", cc_n);}if (feof(fp)) { printf ("End-of-File reached"); }Αν και δεν το testαρα. Έγινε επεξεργασία Δεκέμβριος 17, 2014 από nucleus 1 Link to comment Share on other sites More sharing options...
deninho Δεκέμβριος 17, 2014 Author #3 Κοινοποίηση Δεκέμβριος 17, 2014 it did the job 1 Link to comment Share on other sites More sharing options...
nucleus Δεκέμβριος 17, 2014 #4 Κοινοποίηση Δεκέμβριος 17, 2014 .... Περιμένοντας την επόμενη ερώτηση Link to comment Share on other sites More sharing options...
deninho Δεκέμβριος 17, 2014 Author #5 Κοινοποίηση Δεκέμβριος 17, 2014 Η άλλη ερώτηση θα ήταν, γιατί η δική μου υλοποίηση δε λειτούργησε, αλλά tbh το βασικό είναι ότι διορθώθηκε το bug Link to comment Share on other sites More sharing options...
nucleus Δεκέμβριος 17, 2014 #6 Κοινοποίηση Δεκέμβριος 17, 2014 (edited) Because you were doing it wrong. Ξαναδιαβάζοντας την παράθεση ας δούμε το workflow του τρόπου σου. Είσαι μετά από το διάβασμα και την εκτύπωση της τιμής στην προτελευταία σειρά του αρχείου. Ελέγχει για το feof (δεν έχει φτάσει στο τέλος άρα δεν είναι true) -> fscanf (διαβάζει την τελευταία σειρά του αρχείου και βάζει αυτό που διάβασε στην cc_n και το εκτυπώνει) -> μετά ξαναπάει στην αρχή του while. -> Ελέγχει για το feof (δεν έχει φτάσει στο τέλος άρα δεν είναι true) -> fscanf (προσπαθεί να διαβάσει από το αρχείο) Mayday mayday EOF reached εδώ σου κάνει true το αποτέλεσμα της feof δεν διάβασε κάτι όμως για να αλλάξει η τιμή της cc_n και δεν βγαίνει από το while.Συνεχίζει στην printf και tadaaa μόλις εκτύπωσε δεύτερη φορά την τιμή από την τελευταία γραμμή.Μετά ξαναπάει στην αρχή του while. ->Ελέγχει για το feof (έχει φτάσει στο τέλος άρα είναι true) οπότε δεν μπαίνει στο while. Aς δοκιμάσουμε τον παρακάτω κώδικα while (!feof(fp)){ if(fscanf(fp, "%Ld", &cc_n) != EOF) printf("%Ld", cc_n);} Δουλεύει όπως πρέπει ή όχι? Έγινε επεξεργασία Δεκέμβριος 17, 2014 από nucleus 3 Link to comment Share on other sites More sharing options...
defiant Δεκέμβριος 20, 2014 #7 Κοινοποίηση Δεκέμβριος 20, 2014 Η fscanf επιστρέφει τον αριθμό των επιτυχώς διαβασμένων αριθμών στην περίπτωση σου fscanf(fp, "%Ld", &cc_n)ή EOF όταν φτάσει στο τέλος του αρχείου.Σε περίπτωση που το αρχείο που διαβάζεις έχει κάποιο χαρακτήρα αντί για αριθμό, ο κώδικας σου θα loopαρει συνεχεία μόλις διαβάσει το χαρακτήρα και αποτύχει να τον μετατρέψει. Οπότε ίσως να είναι καλύτερα να τεσταρεις ότι η fscanf διάβασε αριθμό. while (fscanf(fp, "%Ld", &cc_n) == 1) { printf("%Ld\n", cc_n); } 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now