nikos134 Δημοσ. 17 Ιανουαρίου 2014 Δημοσ. 17 Ιανουαρίου 2014 εστω οτι εχουμε το εξής struct guest { int tel; char name[20]; char country[20]; } ; int main() { record.tel=231231; strcpy(record.name, "Raju"); record.country= China; μπορω να αποθηκέυσω structure σε file?? πχ txt?....και επίσης αυτο που θα αποθηκεύσω θα μπορώ μετέπειτα να το ξανανοίξω σαν αρχείο και να πάρω τα δεδομένα του?
migf1 Δημοσ. 18 Ιανουαρίου 2014 Δημοσ. 18 Ιανουαρίου 2014 Δεν μπορείς να το αποθηκεύσεις ως struct. Δηλαδή μπορείς, αλλά όχι με την έννοια που φαντάζομαι πως εννοείς. Βασικά έχεις 2 επιλογές, μια ως binary που δεν είναι portable... // για εγγραφή σε αρχείο που δείχνει ο fp... fwrite( &record, sizeof(struct guest), 1, fp ); // για ανάγνωση από αρχείο που δείχνει ο fp... fread( &record, sizeof(struct guest), 1, fp ); Και μια ως text, που είναι portable... // για εγγραφή σε αρχείο που δείχνει ο fp... fprintf( fp, "%d %20s %20s", record.tel, record.name, record.country ); // για ανάγνωση από αρχείο που δείχνει ο fp... fscanf( fp, "%d %s %s", &record.tel, &record.name, &record.country );
Moderators Kercyn Δημοσ. 18 Ιανουαρίου 2014 Moderators Δημοσ. 18 Ιανουαρίου 2014 Δεν μπορείς να το αποθηκεύσεις ως struct. Δηλαδή μπορείς, αλλά όχι με την έννοια που φαντάζομαι πως εννοείς. Βασικά έχεις 2 επιλογές, μια ως binary που δεν είναι portable... // για εγγραφή σε αρχείο που δείχνει ο fp... fwrite( &record, sizeof(struct guest), 1, fp ); // για ανάγνωση από αρχείο που δείχνει ο fp... fread( &record, sizeof(struct guest), 1, fp ); Και μια ως text, που είναι portable... // για εγγραφή σε αρχείο που δείχνει ο fp... fprintf( fp, "%d %20s %20s", record.tel, record.name, record.country ); // για ανάγνωση από αρχείο που δείχνει ο fp... fscanf( fp, "%d %s %s", &record.tel, &record.name, &record.country ); Τώρα, εάν χρειαστεί να το διαβάσεις: Το binary μπορείς να το διαβάσεις κατ' ευθείαν από το αρχείο (μπορείς να δεις ένα παράδειγμα εδώ), ενώ αν το αποθηκεύσεις ως text θα πρέπει να διαβάζεις γραμμή-γραμμή και να δίνεις τιμές manually στα πεδία του struct. EDIT: Μόλις είδα ότι το post του migf1 καλύπτει και το διάβασμα, οπότε το δικό μου είναι μάλλον άχρηστο Δε γίνεται να το σβήσω, έτσι;
migf1 Δημοσ. 18 Ιανουαρίου 2014 Δημοσ. 18 Ιανουαρίου 2014 ... EDIT: Μόλις είδα ότι το post του migf1 καλύπτει και το διάβασμα, οπότε το δικό μου είναι μάλλον άχρηστο Δε γίνεται να το σβήσω, έτσι; Γίνεται, αλλά γιατί να το κάνεις; Είναι χρήσιμο το link που δίνεις. Απλώς με τον binary τρόπο έχει portability issues (π.χ. τα αρχεία σου δεν θα διαβάζονται σε άλλη πλατφόρμα, εκτός φυσικά αν κάτσεις και γράψεις εξειδικευμένες ρουτίνες I/O για κάθε αρχιτεκτονική/πλατφόρμα). Για τα text, δεν είναι απαραίτητο να γράφονται/διαβάζονται σε γραμμές, αλλά όντως ο κανόνας είναι με γραμμές (και μάλιστα με fputs()/fgets() και προφανώς με s(n)printf() πριν από την fputs(), και με sscanf() μετά από την fgets(). H fscnaf() έχει θέμα από ότι θυμάμαι με τον file-pointer σε περίπτωση σφάλματος... τον αφήνει σε undefined state (αν το θυμάμαι σωστά) οπότε με τη μια χάνεις οποιαδήποτε ελπίδα για τυχόν επιτόπου recovery.
nikos134 Δημοσ. 18 Ιανουαρίου 2014 Μέλος Δημοσ. 18 Ιανουαρίου 2014 Γίνεται, αλλά γιατί να το κάνεις; Είναι χρήσιμο το link που δίνεις. Απλώς με τον binary τρόπο έχει portability issues (π.χ. τα αρχεία σου δεν θα διαβάζονται σε άλλη πλατφόρμα, εκτός φυσικά αν κάτσεις και γράψεις εξειδικευμένες ρουτίνες I/O για κάθε αρχιτεκτονική/πλατφόρμα). Για τα text, δεν είναι απαραίτητο να γράφονται/διαβάζονται σε γραμμές, αλλά όντως ο κανόνας είναι με γραμμές (και μάλιστα με fputs()/fgets() και προφανώς με s(n)printf() πριν από την fputs(), και με sscanf() μετά από την fgets(). H fscnaf() έχει θέμα από ότι θυμάμαι με τον file-pointer σε περίπτωση σφάλματος... τον αφήνει σε undefined state (αν το θυμάμαι σωστά) οπότε με τη μια χάνεις οποιαδήποτε ελπίδα για τυχόν επιτόπου recovery. με μπερδεψες οσο αφορα την fgets με τν fscanf...ποια χρησιμοποιητε περισσοτερο?? και πια η ακριβως διαφορα μεταξυ τους? εγω κανω κατι τετοιο...ειμαι λαθος?? for(i=0; i<d; i++){ for(j=0; j<d; j++){ fscanf(f, "%f", &pinakasA[i][j]); } } }
migf1 Δημοσ. 18 Ιανουαρίου 2014 Δημοσ. 18 Ιανουαρίου 2014 Αν είναι η 1η φορά που θα ασχοληθείς, ξεκίνα με fprintf() / fscanf() που λογικά τις ξέρεις ήδη από τις αντίστοιχες printf() / scanf(). Φτιάξε το πρόγραμμά σου να δουλεύει με αυτές (θα είναι και portable). Μετά, αφού σου δουλέψει σωστά, δοκίμασε το file I/O να το κάνεις με τις fread() / fwrite() ... after all, δεν χρειάζεται πάντα να είναι portable τα προγράμματα που φτιάχνουμε. Έχουν άλλη προσέγγιση αυτές οι τελευταίες, και λογικά θα σε βοηθήσουν να εξοικειωθείς με τα ενδότερα των αρχείων. Εννοώ δεν θα πάει χαμένος ο ο χρόνος που θα αφιερώσεις. Σε ότι αφορά τώρα τις fgets()/fputs(), κοίτα τι γίνεται. Ο μακράν πιο συνηθισμένος τρόπος για interactive I/O (γενικώς σε όλα τα προγράμματα και με όλες τις γλώσσες) είναι αποκλειστικά με strings. Δηλαδή, διαβάζεις τα πάντα ως strings από τον χρήστη (π.χ. fgets()), τα μετατρέπεις εσωτερικά σε ότι χρειάζεσαι (π.χ. με sscanf(),) κάνεις κατόπιν τους υπολογισμούς που θέλεις να κάνεις και τα αποτελέσματα τα μεμτρέπεις πάλι σε string (π.χ. με snprntf()) πριν τα παρουσιάσεις στον χρήστη. Προς το παρόν όμως νομίζω δε χρειάζεται να σε απασχολεί ακόμα αυτό. Είναι καλύτερα πιστεύω να επικεντρωθείς στο file I/O με τις fprintf()/fscanf() και λίγο πιο μετά με τις fread()/fwrite()... και μετά βλέπεις ... εγω κανω κατι τετοιο...ειμαι λαθος?? for(i=0; i<d; i++){ for(j=0; j<d; j++){ fscanf(f, "%f", &pinakasA[i][j]); } } } Αυτό μάλλον το έβαλες με edit, γιατί δεν θυμάμαι να το είδα όταν απάντησα πριν (μπορεί όμως να μην το πρόσεξα). Βασικά δεν μπορώ να σου απαντήσω, γιατί δεν έχω την παραμικρή ιδέα πως συνδέονται αυτά τα 2 loops και ο pinakasA με το struct που έχεις στο αρχικό σου post.
nikos134 Δημοσ. 18 Ιανουαρίου 2014 Μέλος Δημοσ. 18 Ιανουαρίου 2014 Αν είναι η 1η φορά που θα ασχοληθείς, ξεκίνα με fprintf() / fscanf() που λογικά τις ξέρεις ήδη από τις αντίστοιχες printf() / scanf(). Φτιάξε το πρόγραμμά σου να δουλεύει με αυτές (θα είναι και portable). Μετά, αφού σου δουλέψει σωστά, δοκίμασε το file I/O να το κάνεις με τις fread() / fwrite() ... after all, δεν χρειάζεται πάντα να είναι portable τα προγράμματα που φτιάχνουμε. Έχουν άλλη προσέγγιση αυτές οι τελευταίες, και λογικά θα σε βοηθήσουν να εξοικειωθείς με τα ενδότερα των αρχείων. Εννοώ δεν θα πάει χαμένος ο ο χρόνος που θα αφιερώσεις. Σε ότι αφορά τώρα τις fgets()/fputs(), κοίτα τι γίνεται. Ο μακράν πιο συνηθισμένος τρόπος για interactive I/O (γενικώς σε όλα τα προγράμματα και με όλες τις γλώσσες) είναι αποκλειστικά με strings. Δηλαδή, διαβάζεις τα πάντα ως strings από τον χρήστη (π.χ. fgets()), τα μετατρέπεις εσωτερικά σε ότι χρειάζεσαι (π.χ. με sscanf(),) κάνεις κατόπιν τους υπολογισμούς που θέλεις να κάνεις και τα αποτελέσματα τα μεμτρέπεις πάλι σε string (π.χ. με snprntf()) πριν τα παρουσιάσεις στον χρήστη. Προς το παρόν όμως νομίζω δε χρειάζεται να σε απασχολεί ακόμα αυτό. Είναι καλύτερα πιστεύω να επικεντρωθείς στο file I/O με τις fprintf()/fscanf() και λίγο πιο μετά με τις fread()/fwrite()... και μετά βλέπεις Αυτό μάλλον το έβαλες με edit, γιατί δεν θυμάμαι να το είδα όταν απάντησα πριν (μπορεί όμως να μην το πρόσεξα). Βασικά δεν μπορώ να σου απαντήσω, γιατί δεν έχω την παραμικρή ιδέα πως συνδέονται αυτά τα 2 loops και ο pinakasA με το struct που έχεις στο αρχικό σου post. οχι ναι το εβαλα με εδιτ....οχι γενικα μιλωντας,,,αν εχεις ενα αρχειο τχτ και θες να το διαβασεις και να το περασεισ σε πινακα..
bird Δημοσ. 18 Ιανουαρίου 2014 Δημοσ. 18 Ιανουαρίου 2014 οχι ναι το εβαλα με εδιτ....οχι γενικα μιλωντας,,,αν εχεις ενα αρχειο τχτ και θες να το διαβασεις και να το περασεισ σε πινακα.. Ναι, σε γενικές γραμμές, αν έχεις τα στοιχεία του πίνακα με τη σειρά που τα διαβάζεις χωρισμένα με κενό/tab/newline και δεν έχεις άλλα "σκουπίδια" μέσα (σχόλια κτλ)
migf1 Δημοσ. 18 Ιανουαρίου 2014 Δημοσ. 18 Ιανουαρίου 2014 Πρέπει να ελέγχεις και την περίπτωση που κάνει fail η fscanf. Π.χ. για να διαβάεις σε έναν μονοδιάστατο πίνακα με fscanf() ένα text αρχείο που περιέχει floats διαχωρισμένους με blanks, μπορείς να κάνεις κάτι σαν το παρακάτω (το γράφω απευθείας στον editor του φόρουμ, οπότε τσέκαρε το για τυχόν αβλεψίες μου ή/και bugs)... #define MAX_ELEMENTS 100 int arrFloat[MAX_ELEMENTS] = {0.f}; FILE *fp = fopen( "input.txt", "r"); if ( !fp ) { puts( "*** error, cannot open requested file for reading\n" ); } else { int i=0; while ( i < MAX_ELEMENTS && 1 == fscanf(fp, "%f", &arrFloat[i] ) { i++; } if ( i != MAX_ELEMENTS ) { printf( "*** error: the requested file was only PARTIALLY read inside arrFloat[]\n" " (only the first %d elements were read)\n", i+1 ); } else { printf( "%d elements were read successfully into arrFloat[]\n", i ); } }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα