Nananeison Δημοσ. 26 Μαΐου 2013 Δημοσ. 26 Μαΐου 2013 (επεξεργασμένο) Γεια σας..καταρχην να δηλωσω οτι ειμαι αρχαρια και χρειαζομαι την βοηθεια σας για την επιλυση του προβληματος μου που ειναι το εξής: Θέλω να διαβάσω μια ακολουθία αλφαριθμητικών από ένα αρχείο.πχ αυτή: XANTHI 15.8 14.9 16.2 17.4 18.9 25.3 28.8 31.7 21.4 19.5 17.5 15.1 KAVALA 15.6 13.8 16.9 18.2 19.3 26.7 29.5 33.4 22.5 18.4 17.5 14.2 DRAMA 13.5 12.3 15.8 17.3 18.2 24.9 28.9 30.1 21.7 17.1 15.8 13.8 THESSALONIKI 15.9 14.2 17.3 19.4 21.5 17.9 30.6 34.2 24.1 19.6 18.2 14.7 SERRES 16.1 14.7 17.9 19.9 21.8 18.1 30.7 34.6 24.1 19.8 18.7 14.9 LARISA 16.3 15.9 17.8 19.8 22.2 18.3 30.8 35.1 25.5 20.5 19.8 15.3 IOANNINA 14.8 14.2 16.1 18.2 20.3 17.2 27.4 30.5 22.5 19.3 16.9 14.2 ATHENS 15.6 15.2 17.2 20.8 23.1 17.9 30.2 33.5 24.8 19.2 17.8 14.9 SPARTI 16.2 14.7 17.2 19.1 22.7 19.1 29.8 34.3 24.7 20.1 19.1 15.3 HERAKLION 18.3 17.1 19.6 22.4 25.3 30.2 32.4 36.3 31.5 22.7 21.5 19.4 Το πρόβλημα μου είναι το πως θα διαβάσω πρώτα τους χαρακτήρες τοποθετώντας τους σε πίνακα και μετά τους αριθμούς, κάνοντας το ίδιο ώστε να αποφεύγω τα κενά? Σκεφτόμουν να διαβάζω χαρακτήρα χαρακτήρα αλλά εκεί πως θα "φτιάχνω" τον όνομα και τον αριθμό?Οπως καταλαβαίνετε το πρόβλημα μου δεν είναι στο άνοιγμα του αρχείου αλλά κυρίως στο διάβασμα της ακολουθίας. θέλω να κάνω τα ακόλουθα: 1)μια συνάρτηση θα διαβάζει τα ονόματα των πόλεων και τις θερμοκρασίες για τους 12 μήνες και θα το αποθηκεύει σε πίνακα δομών 10 θέσεων που σε κάθε δομή θα καταχωρούνται οι 12 μετρήσεις θερμοκρασιών και το όνομα της κάθε πόλης. #include<stdio.h> #include<conio.h> #define N 10 struct eisodos { char onoma[20]; float temp[12]; }; void inform(struct eisodos dedomena[N]); //void mo(struct eisodos dedomena[N]); FILE *fin; void main() { struct eisodos dedomena[N]; inform(dedomena); //mo(dedomena); } void inform(struct eisodos dedomena[N]) { int i,j; char onoma[13]; float temp[12]; fin=fopen("input.txt","r"); for(i=0;i<N;i=i+1) { fscanf(fin,"%s",dedomena.onoma); for(j=0;j<12;j=j+1) { fscanf(fin,"%f",&dedomena.temp[j]); } } fclose(fin); } Ξέρω οτι έχω λάθη, bugs..οπότε διορθώστε με αν μπορείτε!!Να παρακαλέσω να χρησιμοποιηθουν πανω κατω οσα εχω χρησιμοποιησει μεχρι στιγμήςκαι feof!!οχι fgets fputs κτλ. Επεξ/σία 27 Μαΐου 2013 από Nananeison
imitheos Δημοσ. 26 Μαΐου 2013 Δημοσ. 26 Μαΐου 2013 Στις 26/5/2013 στις 8:32 ΜΜ, Nananeison είπε XANTHI 15.8 14.9 16.2 17.4 18.9 25.3 28.8 31.7 21.4 19.5 17.5 15.1 struct eisodos { char onoma[20]; float temp[12] }; Αυτό που με προβληματίζει κυρίως είναι το πως θα καταλαβαίνει οτι αυτό που διαβάζει ειναι όνομα πόλης ώστε να το καταχωρήσει ως αλφαριθμητικό και στη συνέχεια οτι ο κάθε float αριθμός είναι και για άλλο μήνα.Δηλαδή η διάκριση μεταξύ των αριθμών. Νομίζω ότι αυτά που γράφεις απαντούν μόνα τους στην ερώτησή σου. Έτσι όπως δείχνεις το αρχείο και τη δομή που σου έχει δώσει ο καθηγητής, οι πρώτοι 20 χαρακτήρες της κάθε γραμμής είναι το όνομα της πόλης (συμπληρωμένο με κενά αν είναι μικρότερο) και μετά ακολουθούν οι αριθμοί με 2 ψηφία και 1 δεκαδικό ο καθένας. Άρα για κάθε γραμμή του αρχείου θα μπορούσες να διαβάσεις ολόκληρη τη γραμμή και μετά να την σπάσεις στα πεδία της δομής. Εφόσον όμως δεν θέλεις να χρησιμοποιήσεις fgets ή κάτι παρόμοιο, μπορείς να το κάνεις έτσι με fscanf όπως το έχεις απλά για να ξεχωρίσεις όπως λες τι είναι το κάθε τι που διαβάζει πρέπει να βάλεις τα σωστά format σύμφωνα με το κανόνα που περιέγραψα πριν (αν η δομή του αρχείου είναι όπως είπα). Δεν ανέλυσα άλλα λάθη γιατί έχεις λάθη που είτε έγιναν από βιασύνη και είναι ασήμαντα ή έγιναν επειδή δεν έχεις καταλάβει βασικές έννοιες οπότε είναι σημαντικά. Δεν μπορώ φυσικά να μιλήσω για όλο το φόρουμ αλλά εγώ προσωπικά είτε επείγει είτε όχι δεν μπορώ να σου λύσω την άσκηση. Αν την φτάσεις σε αξιοπρεπές επίπεδο, τότε ευχαρίστως να βοηθήσω με βελτιώσεις.
Nananeison Δημοσ. 27 Μαΐου 2013 Μέλος Δημοσ. 27 Μαΐου 2013 (επεξεργασμένο) Στις 26/5/2013 στις 8:59 ΜΜ, imitheos είπε Άρα για κάθε γραμμή του αρχείου θα μπορούσες να διαβάσεις ολόκληρη τη γραμμή και μετά να την σπάσεις στα πεδία της δομής. Εφόσον όμως δεν θέλεις να χρησιμοποιήσεις fgets ή κάτι παρόμοιο, μπορείς να το κάνεις έτσι με fscanf όπως το έχεις απλά για να ξεχωρίσεις όπως λες τι είναι το κάθε τι που διαβάζει πρέπει να βάλεις τα σωστά format σύμφωνα με το κανόνα που περιέγραψα πριν (αν η δομή του αρχείου είναι όπως είπα). δεν έχω καταλάβει ακριβώς με τι συνθήκη θα διαβάσω πρώτα το όνομα και μετά τις θερμοκρασίες και πως ακριβώς θα το σπάσω. πχ θα μπορούσα να γράψω μετά την πρώτη for fp=fscanf(fin,"%s",ch); while(fp!=EOF) { for(j=0;j<12;j=j+1) { fscanf(fin,"%f",&temp[j]); } } ΕΟF δεν ειναι ομως το τέλος του αρχείου?εγω δεν θελω να το διαβασει ολο απλά το κενό. μηπως πρεπει να γράψω: while(fp!=' ') ???? απλα δεν ειμαι σίγουρη για αυτα που γραφω..και νομιζω ειμαι 200% λάθος σε αυτό που έκανα μόλις!! θα μπορουσες να κανεις μια διορθωση στο κωδικα μετα την for loop γτ εκεί νομίζω δημιουργείται το θέμα με τις εντολές Επεξ/σία 27 Μαΐου 2013 από Nananeison
imitheos Δημοσ. 27 Μαΐου 2013 Δημοσ. 27 Μαΐου 2013 Στις 26/5/2013 στις 9:23 ΜΜ, Nananeison είπε ΕΟF δεν ειναι ομως το τέλος του αρχείου?εγω δεν θελω να το διαβασει ολο απλά το κενό. μηπως πρεπει να γράψω: Όλο το αρχείο θέλεις να διαβάσεις το οποίο θα έχει 10 εγγραφές. Η μεταβλητή dedomena (ασχέτως που την δηλώνεις λανθασμένα στην συνάρτηση) στη main είναι πίνακας 10 θέσεων. Έτσι το μέχρι EOF είναι για όλες τις πόλεις. Μέσα σε αυτό τώρα είναι το τμήμα για κάθε πόλη. Εκεί θέλεις να διαβάσεις ένα string από 20 χαρακτήρες και 12 floats. Άρα για όσο δεν είναι eof, διάβασε 20 χαρακτήρες, 12 φορές * διάβασε ένα float, τελειώσαμε για αυτή τη πόλη άρα πάμε στην επόμενη θέση του πίνακα δομών. Στο περίπου αυτό έφτιαξες αλλά έχει κάποια λάθη.
Nananeison Δημοσ. 27 Μαΐου 2013 Μέλος Δημοσ. 27 Μαΐου 2013 (επεξεργασμένο) Στις 26/5/2013 στις 8:59 ΜΜ, imitheos είπε Δεν ανέλυσα άλλα λάθη γιατί έχεις λάθη που είτε έγιναν από βιασύνη και είναι ασήμαντα ή έγιναν επειδή δεν έχεις καταλάβει βασικές έννοιες οπότε είναι σημαντικά. Δεν μπορώ φυσικά να μιλήσω για όλο το φόρουμ αλλά εγώ προσωπικά είτε επείγει είτε όχι δεν μπορώ να σου λύσω την άσκηση. Αν την φτάσεις σε αξιοπρεπές επίπεδο, τότε ευχαρίστως να βοηθήσω με βελτιώσεις. Φυσικά και εχετε δίκιο και προς θεού δεν ζήτησα έτοιμη λυση..και νομιζω τα περισσοτερα λαθη διορθώθηκαν..ριξτε μια ματιά αν δεν είναι κόπος σε περίπτωση που εντοπίσετε κατι που μου ξέφυγε. Στις 26/5/2013 στις 9:35 ΜΜ, imitheos είπε Άρα για όσο δεν είναι eof, διάβασε 20 χαρακτήρες, 12 φορές * διάβασε ένα float, τελειώσαμε για αυτή τη πόλη άρα πάμε στην επόμενη θέση του πίνακα δομών. Στο περίπου αυτό έφτιαξες αλλά έχει κάποια λάθη. Νομίζω κάτι τέτοιο είναι αρκετά κοντά αλλά έχω την εντύπωση ότι έτσι δεν αποθηκεύονται τα ονόματα τον πόλεων.Γενικά με τις δομές είμαι αρκετά ανασφαλής! Aν κατάλαβα σωστά η διαδικασία είναι η εξής:ξεκινά διαβάζει το αρχείο, εντοπίζει συμβολοσειρά (το όνομα της πρώτης πόλης), το αποθηκεύει στη δομή dedomena[0].onoma μετά συνεχίζει το διάβασμα κειμένου από κει που έμεινε και εντοπίζει τον πρώτο πραγματικό αριθμό και τον αποθηκεύει στο dedomena[0].temp[0].Επειδή οι πραγματικοί είναι ακριβώς όσοι ο πίνακας τους αποθηκεύει όλους μέχρι dedomena[0].temp[11].Στη συνέχεια η επανάληψη ξεκινά ξανά από την αρχή όπου στο διάβασμα από κει που έμεινε(δηλαδή τον τελευταίο πραγματικό της πρώτης σειράς,μετά βρίσκει πάλι όνομα πόλης και συνεχίζει το ίδιο.Έτσι? for(i=0;i<N;i=i+1) { fscanf(fin,"%s",dedomena].onoma); for(j=0;j<12;j=j+1) { fscanf(fin,"%f",&dedomena.temp[j]); } } Επεξ/σία 27 Μαΐου 2013 από Nananeison
acid18 Δημοσ. 27 Μαΐου 2013 Δημοσ. 27 Μαΐου 2013 Κάθε γράμμη έχει 13 "πράγματα" που χωρίζονται με κενό, το πρώτο είναι το όνομα της πόλης και τα υπόλοιπα οι θερμοκρασίες. Διάβασε κάθε γράμμη ξεχωριστά με fges, μετά σπάσε την γραμμή με strtok.
Nananeison Δημοσ. 27 Μαΐου 2013 Μέλος Δημοσ. 27 Μαΐου 2013 Στις 27/5/2013 στις 12:08 ΠΜ, acid18 είπε Κάθε γράμμη έχει 13 "πράγματα" που χωρίζονται με κενό, το πρώτο είναι το όνομα της πόλης και τα υπόλοιπα οι θερμοκρασίες. Διάβασε κάθε γράμμη ξεχωριστά με fges, μετά σπάσε την γραμμή με strtok. Ευχαριστώ πολύ για την απάντηση σου αλλά δεν ξέρω να δουλεύω με τέτοιες συναρτήσεις...
imitheos Δημοσ. 27 Μαΐου 2013 Δημοσ. 27 Μαΐου 2013 Στις 26/5/2013 στις 10:34 ΜΜ, Nananeison είπε Aν κατάλαβα σωστά η διαδικασία είναι η εξής:ξεκινά διαβάζει το αρχείο, εντοπίζει συμβολοσειρά (το όνομα της πρώτης πόλης), το αποθηκεύει στη δομή dedomena[0].onoma μετά συνεχίζει το διάβασμα κειμένου από κει που έμεινε και εντοπίζει τον πρώτο πραγματικό αριθμό και τον αποθηκεύει στο dedomena[0].temp[0].Επειδή οι πραγματικοί είναι ακριβώς όσοι ο πίνακας τους αποθηκεύει όλους μέχρι dedomena[0].temp[11].Στη συνέχεια η επανάληψη ξεκινά ξανά από την αρχή όπου στο διάβασμα από κει που έμεινε(δηλαδή τον τελευταίο πραγματικό της πρώτης σειράς,μετά βρίσκει πάλι όνομα πόλης και συνεχίζει το ίδιο.Έτσι? for(i=0;i<N;i=i+1) { fscanf(fin,"%s",dedomena[i]].onoma); for(j=0;j<12;j=j+1) { fscanf(fin,"%f",&dedomena[i].temp[j]); } } Ναι με τη διαφορά ότι δεν "εντοπίζει" τίποτα. Διαβάζει χαρακτήρες από ένα αρχείο. Πόσους χαρακτήρες θα διαβάσει και πως θα ερμηνευτούν αυτοί εξαρτάται από τι θα του πεις εσύ. Με το format %s του λες να διαβάσει ένα string μέχρι να βρει κενό επειδή ξέρεις ότι έχεις ένα όνομα πόλης. Αν στην αρχή της γραμμής του βάλεις να διαβάσει "%f" θα προσπαθήσει να διαβάσει τη πόλη σαν δεκαδικό αριθμό (και φυσικά θα αποτύχει). Ό,τι του πεις να διαβάσει αυτό διαβάζει.
acid18 Δημοσ. 27 Μαΐου 2013 Δημοσ. 27 Μαΐου 2013 float temp; char *tempstring; char line[100]; while (fgets(line,100,fp) != NULL) { i = 0; tempstring = strtok(line," "); while (tempstring != NULL) { if (i == 0) { //printf("%s\n",tempstr); temp1[j].onoma = _strdup(tempstring); //printf("%s\n",test[j].onoma); } else { temp = atof(tempstring); temp1[j].thermokrasies[i-1] = temp; //printf("%f\n",temp); } tempstring = strtok (NULL, " "); i++; } j++; } j++;
Nananeison Δημοσ. 27 Μαΐου 2013 Μέλος Δημοσ. 27 Μαΐου 2013 Στις 27/5/2013 στις 6:16 ΠΜ, imitheos είπε Ναι με τη διαφορά ότι δεν "εντοπίζει" τίποτα. Διαβάζει χαρακτήρες από ένα αρχείο. Πόσους χαρακτήρες θα διαβάσει και πως θα ερμηνευτούν αυτοί εξαρτάται από τι θα του πεις εσύ. Με το format %s του λες να διαβάσει ένα string μέχρι να βρει κενό επειδή ξέρεις ότι έχεις ένα όνομα πόλης. Αν στην αρχή της γραμμής του βάλεις να διαβάσει "%f" θα προσπαθήσει να διαβάσει τη πόλη σαν δεκαδικό αριθμό (και φυσικά θα αποτύχει). Ό,τι του πεις να διαβάσει αυτό διαβάζει. Oταν λέω "εντοπίζει" εννοώ διαβάζει αυτό που του έχω πει.. Υπάρχει και αυτοματοποιημένος τρόπος που ότι διαβάζει θα καταλαβαίνει αν θα το καταχωρεί σε %s ή σε %f? Εγώ σύμφωνα με την μορφή του αρχείου επειδή ξέρω οτι πρώτα διαβάζει το όνομα και μετά τις 12 μετρήσεις για αυτόν το λόγο έβαλα την fscanf %s πριν από τις 12 επαναλήψεις για τις θερμοκρασίες και μέσα εδώ την fscanf %f! Πάντως τα ονόματα των πόλεων καταχωρούνται σωστά στον πίνακα dedomena[10].onoma έτσι?Δηλαδή μένουν μόνιμα στον πίνακα..δεν εξαφανίζονται μόλις τελειώσουν οι επαναλήψεις. Στις 27/5/2013 στις 6:16 ΠΜ, acid18 είπε αcid 18....Θα ήθελα να μπορέσω να εκτιμήσω τον χρόνο και τον κόπο σου απλά επειδη δεν ξερω αυτές τις συναρτήσεις δεν με βοηθούν στην κατανόηση της λύσης του προβλήματος.Και πάλι ευχαριστώ...
παπι Δημοσ. 27 Μαΐου 2013 Δημοσ. 27 Μαΐου 2013 Εμφάνιση κρυμμένου περιεχομένου Δεν βλεπω απαντηση απο mig... και ο αλλος (defacer) καπου χαθηκε.. ρε μπας και ολη αυτη η ιστορια ηταν ενας ερωτας μεγαλος; χααχαχα 1
bird Δημοσ. 27 Μαΐου 2013 Δημοσ. 27 Μαΐου 2013 Στις 27/5/2013 στις 1:40 ΜΜ, Nananeison είπε Oταν λέω "εντοπίζει" εννοώ διαβάζει αυτό που του έχω πει.. Υπάρχει και αυτοματοποιημένος τρόπος που ότι διαβάζει θα καταλαβαίνει αν θα το καταχωρεί σε %s ή σε %f? Εγώ σύμφωνα με την μορφή του αρχείου επειδή ξέρω οτι πρώτα διαβάζει το όνομα και μετά τις 12 μετρήσεις για αυτόν το λόγο έβαλα την fscanf %s πριν από τις 12 επαναλήψεις για τις θερμοκρασίες και μέσα εδώ την fscanf %f! Πάντως τα ονόματα των πόλεων καταχωρούνται σωστά στον πίνακα dedomena[10].onoma έτσι?Δηλαδή μένουν μόνιμα στον πίνακα..δεν εξαφανίζονται μόλις τελειώσουν οι επαναλήψεις. Καλά έκανες κι έβαλες να διαβάζει πρώτα ένα string και μετά 12 float αλλά αυτό που μάλλον θέλει να σου πει ο imitheos είναι το τι γίνεται σε περίπτωση που το όνομα της πόλης έχει μέσα κενό. Αν για παράδειγμα μια πόλη ήταν τα "Καμένα Βούρλα" το "Λος Αντζελες" κτλ τότε η fscanf θα διάβαζε μόνο την πρώτη λέξη και μετά που θα πήγαινες να διαβάσεις float θα είχες λάθος...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα