Jump to content



[C] Ανάγνωση από αρχείο


Recommended Posts

Χρειάζομαι μια επανάληψη, που κάθε φορά θα διαβάζει από ένα αρχείο

 

έχω γράψει:

while (!feof(fp)){fscanf(fp, "%Ld", &cc_n);printf("%Ld", cc_n);}

Και το τελευταίο στοιχείο (ένας αριθμός ανά γραμμή) του αρχείου το τυπώνει 2 φορές. Το ίδιο συμβαίνει όταν περνάω τη μεταβλητή cc_n στη συνάρτησή μου. Καμιά ιδέα για το που είναι το λάθος;

 

Υπ'όψιν, δε γνωρίζω το πόσα στοιχεία θα έχει το αρχείο μου

Link to comment
Share on other sites

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αρα.




			
				


	Έγινε επεξεργασία  από nucleus
	
	

			
		
  • Like 1
Link to comment
Share on other sites

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);}

Δουλεύει όπως πρέπει ή όχι?

Έγινε επεξεργασία από nucleus
  • Like 3
Link to comment
Share on other sites

Η fscanf επιστρέφει τον αριθμό των επιτυχώς διαβασμένων αριθμών στην περίπτωση σου

 fscanf(fp, "%Ld", &cc_n)

ή EOF όταν φτάσει στο τέλος του αρχείου.

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

 

Οπότε ίσως να είναι καλύτερα να τεσταρεις ότι η fscanf διάβασε αριθμό.

  while (fscanf(fp, "%Ld", &cc_n) == 1)  {        printf("%Ld\n", cc_n);  }
  • Like 1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.