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

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

Δημοσ.

Προγραμμα στην 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;
}
Δημοσ.
  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);
Δημοσ.

 

  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);
  • Like 2
Δημοσ.

Καλό θα ήταν να βγάλεις το 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++) 
  • Like 1
Δημοσ.

 

 

 

Για να διαβάσεις 10 μαθητές πρέπει να δηλώσεις ένα πίνακα μέγεθος Πίνακας[9], καθώς στο προγραμματισμό ξεκινάμε από το 0 και όχι από το 1 . Άρα για 10 θέσεις σε ένα πίνακα έχεις Πίνακας[0],Πίνακας[1],..,Πίνακας[9].

Επομένως  πρέπει να αλλάξεις και την for σου εκεί που διαβάζεις τα στοιχεία.

for(i=0; i<10; i++) 

 

Προσοχή. Mόνο η πρώτη φράση είναι λάθος: αν θέλεις πίνακα 10 στοιχείων πρέπει να τον δηλώσεις bathmoi[10], δηλαδή στις αγκύλες βάζεις το πλήθος των στοιχείων.

Όλα τα υπόλοιπα είναι σωστά: οι δείκτες πάνε από 0 μέχρι 9 και το for πρέπει να γίνει ακριβώς έτσι.

  • Like 1
Δημοσ.

Παιδια καλησπερα το τελειωποιησα νομιζω με λιγη προσπαθεια ακομα για δειτε και εσεις  σωστο δεν ειναι ?

 

 

#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 και θα ειναι οκ μετα πιστευω....

Δημοσ.

μονο το struct βαθμοι μαθητες θα αλλαξω σε 9 και θα ειναι οκ μετα πιστευω....

Δες την παραπάνω απάντηση. Δε χρειάζεται να το αλλάξεις.

Δημοσ.

Δες την παραπάνω απάντηση. Δε χρειάζεται να το αλλάξεις.

δηλαδη ειναι μια ενταξει? δεν θελει καποια αλλη αλλαγη..

Δημοσ.

δηλαδη ειναι μια ενταξει? δεν θελει καποια αλλη αλλαγη..

Προσπάθησες να το κάνεις 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);
}
Δημοσ.

 

Προσπάθησες να το κάνεις 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 αυξανεται

Δημοσ.

χωρις το το & δεν μου αποθηκευη τα στοιχεια που θελω  (ονομα,επωνυμο,βαθμοι) στο 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. Αν θέλεις δηλαδή δυαδικό αρχείο!

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

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

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

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

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

Σύνδεση

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

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