programmer Δημοσ. 7 Ιουνίου 2014 Δημοσ. 7 Ιουνίου 2014 Προγραμμα στην C το οποιο θα φτιαχνει struct ονομα,επωνυμο,βαθμοι οι βαθμοι θα ειναι πινακες να την γεμηση αυτη την δομη για 10 μαθητες στη συνεχεια θα μεταφερη τα δεδομενα των μαθητων σε δυαδικο αρχειο με ονομα μαθητες..παιδια καταρχας θελω να μου πειτε αν ο κωδικας μου μεχρι στιγμης ειναι ενταξει η αν θελει καποιες αλλαγες. πως μπορω να κανω εγγραφη σε ενα αρχειο απο δομη? #include <stdio.h> #include <stdlib.h> int main () { struct stoixeia { char onoma[10]; char epwnumo[20]; float bathmoi; }bathmoi[10]; int i=0; FILE *fp; fp=fopen("mathites.txt","w"); for(i=0;i<=10;i++) { printf("dwse to onoma %d mathith\n",i+1); scanf("%s",&bathmoi.onoma); } for (i=0;i<=10;i++) { printf("dwse to epwnumo %d mathith\n",i+1); scanf("%s",&bathmoi.epwnumo); } for (i=0;i<=10;i++) { printf("dwse ton bathmo gia ton %d mathith:",i+1); scanf("%d",&bathmoi.bathmoi); } return 0; }
H_ANARXIA_EINAI_PSEMA Δημοσ. 7 Ιουνίου 2014 Δημοσ. 7 Ιουνίου 2014 scanf("%s",&bathmoi[i].onoma); scanf("%s",&bathmoi[i].epwnumo); Αυτά τα δύο είναι λάθος. Δεν πρέπει να βάλεις το & εκεί. Βγάλε το και θα είναι ΟΚ. Για να κάνεις εγγραφή των δεδομένων στο αρχείο θα το κάνεις κάπως έτσι: fprintf(fp, "%s %s %f\n", bathmoi[i].onoma, bathmoi[i].epwnumo, bathmoi[i].bathmoi); Και μετά θα το διαβάζεις έτσι fscanf(fp, "%s %s %f", bathmoi[i].onoma, bathmoi[i].epwnumo, &bathmoi[i].bathmoi);
lion2486 Δημοσ. 7 Ιουνίου 2014 Δημοσ. 7 Ιουνίου 2014 scanf("%s",&bathmoi[i].onoma); scanf("%s",&bathmoi[i].epwnumo); Αυτά τα δύο είναι λάθος. Δεν πρέπει να βάλεις το & εκεί. Βγάλε το και θα είναι ΟΚ. Για να κάνεις εγγραφή των δεδομένων στο αρχείο θα το κάνεις κάπως έτσι: fprintf(fp, "%s %s %f\n", bathmoi[i].onoma, bathmoi[i].epwnumo, bathmoi[i].bathmoi); Και μετά θα το διαβάζεις έτσι fscanf(fp, "%s %s %f", bathmoi[i].onoma, bathmoi[i].epwnumo, &bathmoi[i].bathmoi); μήπως για να το γράφεις binary εννοεί κάτι της μορφής fwrite(bathmoi, sizeof(stoixeia), 10, fp); 2
vinso Δημοσ. 7 Ιουνίου 2014 Δημοσ. 7 Ιουνίου 2014 Καλό θα ήταν να βγάλεις το struct μέσα από τη main συνάρτηση σου και να δηλώνεις το πίνακα μόλις ξεκινάει το πρόγραμμα μέσα στη main έτσι. struct stoixeia bathmoi[10]; Μέσα στο struct, το πεδίο βαθμοί είναι float και εσύ μόλις το διαβάζεις το έχεις %d που είναι για int . Αλλάζεις όποιο θες αρκεί εκεί που δηλώνεις int να διαβάζεις με %d και εκεί που δηλώνεις float να διαβάζεις με %f . Για να διαβάσεις 10 μαθητές πρέπει να δηλώσεις ένα πίνακα μέγεθος Πίνακας[9], καθώς στο προγραμματισμό ξεκινάμε από το 0 και όχι από το 1 . Άρα για 10 θέσεις σε ένα πίνακα έχεις Πίνακας[0],Πίνακας[1],..,Πίνακας[9]. Επομένως πρέπει να αλλάξεις και την for σου εκεί που διαβάζεις τα στοιχεία. for(i=0; i<10; i++) 1
nplatis Δημοσ. 9 Ιουνίου 2014 Δημοσ. 9 Ιουνίου 2014 Για να διαβάσεις 10 μαθητές πρέπει να δηλώσεις ένα πίνακα μέγεθος Πίνακας[9], καθώς στο προγραμματισμό ξεκινάμε από το 0 και όχι από το 1 . Άρα για 10 θέσεις σε ένα πίνακα έχεις Πίνακας[0],Πίνακας[1],..,Πίνακας[9]. Επομένως πρέπει να αλλάξεις και την for σου εκεί που διαβάζεις τα στοιχεία. for(i=0; i<10; i++) Προσοχή. Mόνο η πρώτη φράση είναι λάθος: αν θέλεις πίνακα 10 στοιχείων πρέπει να τον δηλώσεις bathmoi[10], δηλαδή στις αγκύλες βάζεις το πλήθος των στοιχείων. Όλα τα υπόλοιπα είναι σωστά: οι δείκτες πάνε από 0 μέχρι 9 και το for πρέπει να γίνει ακριβώς έτσι. 1
programmer Δημοσ. 9 Ιουνίου 2014 Μέλος Δημοσ. 9 Ιουνίου 2014 Παιδια καλησπερα το τελειωποιησα νομιζω με λιγη προσπαθεια ακομα για δειτε και εσεις σωστο δεν ειναι ? #include<stdio.h> #include<stdlib.h> int main () { struct bathmoi { char onoma[10]; char epwnumo[20]; float bathmoi; }; struct bathmoi mathiths[10]; int i;// για να γεμισουμε στοιχεια με την for FILE *fp;// δηλωση αρχειου fp=fopen("mathites.txt","w");// ανοιγμα αρχειου if(fp==NULL) { printf("problhma sto anoigma tou arxeiou"); exit(1);// το προγραμμα αν δεν ανοιξη επιστρεφη τιμη 1 και κλεινει } for(i=0;i<=9;i++) { printf("dwse to onoma tou %d mathith\n",i+1); scanf("%s",&mathiths.onoma); printf("dwse to epwnumo tou %d mathith\n",i+1); scanf("%s",&mathiths.epwnumo); printf("dwse to bathmo tou %d mathith\n",i+1); scanf("%f",&mathiths.bathmoi); } for (i=0;i<=9;i++) { fprintf(fp,"%s\n%s\n%f\n",mathiths.onoma,mathiths.epwnumo,mathiths.bathmoi); } fclose(fp);//κλεινει το αρχειο return 0; system("pause"); } μονο το struct βαθμοι μαθητες θα αλλαξω σε 9 και θα ειναι οκ μετα πιστευω....
gon1332 Δημοσ. 9 Ιουνίου 2014 Δημοσ. 9 Ιουνίου 2014 μονο το struct βαθμοι μαθητες θα αλλαξω σε 9 και θα ειναι οκ μετα πιστευω.... Δες την παραπάνω απάντηση. Δε χρειάζεται να το αλλάξεις.
programmer Δημοσ. 9 Ιουνίου 2014 Μέλος Δημοσ. 9 Ιουνίου 2014 Δες την παραπάνω απάντηση. Δε χρειάζεται να το αλλάξεις. δηλαδη ειναι μια ενταξει? δεν θελει καποια αλλη αλλαγη..
gon1332 Δημοσ. 9 Ιουνίου 2014 Δημοσ. 9 Ιουνίου 2014 δηλαδη ειναι μια ενταξει? δεν θελει καποια αλλη αλλαγη.. Προσπάθησες να το κάνεις compile; Με μία ματιά βλέπω δύο λαθάκια που θα χτυπήσουν κατά το compile: for (i = 0; i <= 9; i++) { printf("dwse to onoma tou %d mathith\n",i+1); scanf("%s", &mathiths[i].onoma); // ΔΕ ΧΡΕΙΑΖΕΤΑΙ ΤΟ & !!!!! printf("dwse to epwnumo tou %d mathith\n",i+1); scanf("%s", &mathiths[i].epwnumo);// ΔΕ ΧΡΕΙΑΖΕΤΑΙ ΤΟ & !!!!! printf("dwse to bathmo tou %d mathith\n",i+1); scanf("%f", &mathiths[i].bathmoi); }
Nexus12 Δημοσ. 9 Ιουνίου 2014 Δημοσ. 9 Ιουνίου 2014 Προσπάθησες να το κάνεις compile; Με μία ματιά βλέπω δύο λαθάκια που θα χτυπήσουν κατά το compile: for (i = 0; i <= 9; i++) { printf("dwse to onoma tou %d mathith\n",i+1); scanf("%s", &mathiths[i].onoma); // ΔΕ ΧΡΕΙΑΖΕΤΑΙ ΤΟ & !!!!! printf("dwse to epwnumo tou %d mathith\n",i+1); scanf("%s", &mathiths[i].epwnumo);// ΔΕ ΧΡΕΙΑΖΕΤΑΙ ΤΟ & !!!!! printf("dwse to bathmo tou %d mathith\n",i+1); scanf("%f", &mathiths[i].bathmoi); } χωρις το το & δεν μου αποθηκευη τα στοιχεια που θελω (ονομα,επωνυμο,βαθμοι) στο txt μου το εχω κανει αυτο που λες τρεχει κανονικα το προγραμμα και οταν ανοιγω το αρχειο ειναι μεσα τα ονοματα ...χωρις το & αποθηκευει τις τιμες του i δλδ της μνημης οταν το i αυξανεται
gon1332 Δημοσ. 9 Ιουνίου 2014 Δημοσ. 9 Ιουνίου 2014 χωρις το το & δεν μου αποθηκευη τα στοιχεια που θελω (ονομα,επωνυμο,βαθμοι) στο txt μου το εχω κανει αυτο που λες τρεχει κανονικα το προγραμμα και οταν ανοιγω το αρχειο ειναι μεσα τα ονοματα ...χωρις το & αποθηκευει τις τιμες του i δλδ της μνημης οταν το i αυξανεται Μου λες ότι όταν βγάζεις το &, τότε δε σου δουλεύει; Αυτό είναι παράξενο. Έπρεπε να σου δουλεύει χωρίς το & όταν διαβάζεις strings. Με το & μπροστά πρέπει να σου πετάει κάποιο warning. Εμένα μου πετάει από ένα warning, αλλά μου δουλεύει μετά καλά: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[10]’ [-Wformat=] scanf("%s", &mathiths[i].onoma); Το %s περιμένει δείκτη σε χαρακτήρα, αλλά εσύ του περνάς δείκτη σε πίνακα δέκα θέσεων από χαρακτήρες. Αυτό σημαίνει πως δε χρειάζεται να του κάνεις γνωστό πως ο πίνακας περιέχει 10 χαρακτήρες. Το μόνο που θέλει να μάθει είναι ποιά είναι η διεύθυνση του πρώτου χαρακτήρα. Τα υπόλοιπα θα τα βρει μόνο του. Αυτό συμβαίνει γιατί όταν φτιάχνει κανείς μια συνάρτηση δε μπορεί να ξέρει από πριν πιο είναι το μέγεθος του input αν μιλάμε για πίνακα. Έτσι και με την scanf. Ας με διορθώσει κάποιος πιο έμπειρος αν πέταξα "κοτσάνα". Επίσης να μη ξεχνάμε πως το & έτσι όπως το έχεις βάλει (χωρίς παρενθέσεις) αναφέρεται στο πεδίο του struct καθώς η '.' έχει μεγαλύτερη προτεραιότητα του &. Δοκίμασε πάλι χωρίς το & για το διάβασμα strings και πες μας. Υ.Γ.: Επίσης να σε ρωτήσω. Είσαι το ίδιο άτομο με τον Programmer; Εννοώ μιλάμε για την ίδια εκφώνηση; Αν είναι έτσι αντί για fprintf έπρεπε να χρησιμοποιήσεις αυτό όπως είπε ο lion2486. Αν θέλεις δηλαδή δυαδικό αρχείο!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα