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

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

Δημοσ. (επεξεργασμένο)

Γεια σας..καταρχην να δηλωσω οτι ειμαι αρχαρια και χρειαζομαι την βοηθεια σας για την επιλυση του προβληματος μου που ειναι το εξής: 

Θέλω να διαβάσω μια ακολουθία αλφαριθμητικών από ένα αρχείο.πχ αυτή:

 

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 κτλ.

Επεξ/σία από Nananeison
Δημοσ.
  Στις 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 σύμφωνα με το κανόνα που περιέγραψα πριν (αν η δομή του αρχείου είναι όπως είπα).

 

Δεν ανέλυσα άλλα λάθη γιατί έχεις λάθη που είτε έγιναν από βιασύνη και είναι ασήμαντα ή έγιναν επειδή δεν έχεις καταλάβει βασικές έννοιες οπότε είναι σημαντικά. Δεν μπορώ φυσικά να μιλήσω για όλο το φόρουμ αλλά εγώ προσωπικά είτε επείγει είτε όχι δεν μπορώ να σου λύσω την άσκηση. Αν την φτάσεις σε αξιοπρεπές επίπεδο, τότε ευχαρίστως να βοηθήσω με βελτιώσεις.

Δημοσ. (επεξεργασμένο)
  Στις 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 γτ εκεί νομίζω δημιουργείται το θέμα με τις εντολές

Επεξ/σία από Nananeison
Δημοσ.
  Στις 26/5/2013 στις 9:23 ΜΜ, Nananeison είπε

ΕΟF δεν ειναι ομως το τέλος του αρχείου?εγω δεν θελω να το διαβασει ολο απλά το κενό.

μηπως πρεπει να γράψω:

Όλο το αρχείο θέλεις να διαβάσεις το οποίο θα έχει 10 εγγραφές. Η μεταβλητή dedomena (ασχέτως που την δηλώνεις λανθασμένα στην συνάρτηση) στη main είναι πίνακας 10 θέσεων. Έτσι το μέχρι EOF είναι για όλες τις πόλεις. Μέσα σε αυτό τώρα είναι το τμήμα για κάθε πόλη. Εκεί θέλεις να διαβάσεις ένα string από 20 χαρακτήρες και 12 floats.

 

Άρα για όσο δεν είναι eof, διάβασε 20 χαρακτήρες, 12 φορές * διάβασε ένα float, τελειώσαμε για αυτή τη πόλη άρα πάμε στην επόμενη θέση του πίνακα δομών. Στο περίπου αυτό έφτιαξες αλλά έχει κάποια λάθη.

Δημοσ. (επεξεργασμένο)
  Στις 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]);
                       }
               }
Επεξ/σία από Nananeison
Δημοσ.

Κάθε γράμμη έχει 13 "πράγματα" που χωρίζονται με κενό, το πρώτο είναι το όνομα της πόλης και τα υπόλοιπα οι θερμοκρασίες.

Διάβασε κάθε γράμμη ξεχωριστά με fges, μετά σπάσε την γραμμή με strtok.

Δημοσ.
  Στις 27/5/2013 στις 12:08 ΠΜ, acid18 είπε

Κάθε γράμμη έχει 13 "πράγματα" που χωρίζονται με κενό, το πρώτο είναι το όνομα της πόλης και τα υπόλοιπα οι θερμοκρασίες.

Διάβασε κάθε γράμμη ξεχωριστά με fges, μετά σπάσε την γραμμή με strtok.

Ευχαριστώ πολύ για την απάντηση σου αλλά δεν ξέρω να δουλεύω με τέτοιες συναρτήσεις...

Δημοσ.
  Στις 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" θα προσπαθήσει να διαβάσει τη πόλη σαν δεκαδικό αριθμό (και φυσικά θα αποτύχει). Ό,τι του πεις να διαβάσει αυτό διαβάζει.
Δημοσ.

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++;
Δημοσ.
  Στις 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....Θα ήθελα να μπορέσω να εκτιμήσω τον χρόνο και τον κόπο σου απλά επειδη δεν ξερω αυτές τις συναρτήσεις δεν με βοηθούν στην κατανόηση της λύσης του προβλήματος.Και πάλι ευχαριστώ...  
:rolleyes:

 

 

Δημοσ.
  Εμφάνιση κρυμμένου περιεχομένου

  • Like 1
Δημοσ.
  Στις 27/5/2013 στις 1:40 ΜΜ, Nananeison είπε

Oταν λέω "εντοπίζει" εννοώ διαβάζει αυτό που του έχω πει..

 

Υπάρχει και αυτοματοποιημένος τρόπος που ότι διαβάζει θα καταλαβαίνει αν θα το καταχωρεί σε %s ή σε %f?

 

Εγώ σύμφωνα με την μορφή του αρχείου επειδή ξέρω οτι πρώτα διαβάζει το όνομα και μετά τις 12 μετρήσεις για αυτόν το λόγο έβαλα την fscanf  %s πριν από τις 12 επαναλήψεις για τις θερμοκρασίες και μέσα εδώ την fscanf %f!

 

Πάντως τα ονόματα των πόλεων καταχωρούνται σωστά στον πίνακα dedomena[10].onoma έτσι?Δηλαδή μένουν μόνιμα στον πίνακα..δεν εξαφανίζονται μόλις τελειώσουν οι επαναλήψεις.

Καλά έκανες κι έβαλες να διαβάζει πρώτα ένα string και μετά 12 float αλλά αυτό που μάλλον θέλει να σου πει ο imitheos είναι το τι γίνεται σε περίπτωση που το όνομα της πόλης έχει μέσα κενό. Αν για παράδειγμα μια πόλη ήταν τα "Καμένα Βούρλα" το "Λος Αντζελες" κτλ τότε η fscanf θα διάβαζε μόνο την πρώτη λέξη και μετά που θα πήγαινες να διαβάσεις float θα είχες λάθος...

 

 

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

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

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

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

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

Σύνδεση

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

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