Dinos_12345 Δημοσ. 10 Σεπτεμβρίου 2016 Δημοσ. 10 Σεπτεμβρίου 2016 Έστω ότι έχουμε ένα αρχείο που έχει εγγραφές με μορφή name, tax, income Πως μπορώ να πάρω αυτές τις εγγραφές μία μία και να τις περάσω στα attributes ενός tax_declaration αντικειμένου; Ξέρω πως γίνεται με την sscanf της C αλλά δεν ξέρω τι attributes να δώσω και πως.
Moderators Kercyn Δημοσ. 10 Σεπτεμβρίου 2016 Moderators Δημοσ. 10 Σεπτεμβρίου 2016 http://stackoverflow.com/questions/3555715/how-to-read-formatted-data-in-c
Dinos_12345 Δημοσ. 10 Σεπτεμβρίου 2016 Μέλος Δημοσ. 10 Σεπτεμβρίου 2016 Τελικά ήταν type, income, date. Το δοκίμασα αυτό, το τροποποίησα όπως πρέπει για το αρχείο μου, αλλά στο τρέξιμο δεν εμφανίζει τίποτα. void input_file(string name){ ifstream ist("taxes.txt"); cout << ist; string date; string type; float income; while(ist >> type >> income >> date) cout << type << ' ' << income << ' ' << date << endl; }
defacer Δημοσ. 10 Σεπτεμβρίου 2016 Δημοσ. 10 Σεπτεμβρίου 2016 Γενικά μιλώντας μια καλή πρώτη προσέγγιση είναι να δηλώσεις μέσα στην class friend std::istream& operator>>(std::istream& is, tax_declaration& d); και μετά να τον κάνεις implement (σαν free function, έξω από την class) std::istream& operator>>(std::istream& is, tax_declaration& d) { // extract stuff from is and put it into d return is; } οπότε μετά σε higher level κώδικα απλά θα κάνεις input_stream >> tax_declaration_instance; Υπόψιν ότι επειδή ο operator >> επιστρέφει std::istream και επειδή υπάρχει στη standard library o std::ios::operator bool, αν κάνεις σωστά την υλοποίηση μετά αυτό το assignment μπορείς να το βάλεις μέσα σε if: if (!(input_stream >> tax_declaration_instance)) { // the stream had some problem, e.g. maybe end of file } Το δοκίμασα αυτό, το τροποποίησα όπως πρέπει για το αρχείο μου, αλλά στο τρέξιμο δεν εμφανίζει τίποτα. Οπότε όπως φαίνεται το ist είναι σε bad state. Debug it.
Dinos_12345 Δημοσ. 10 Σεπτεμβρίου 2016 Μέλος Δημοσ. 10 Σεπτεμβρίου 2016 Το κάνω debug και βλέπω και την δική σου λύση, η οποία με μία πρώτη ματιά και μετά από 3 μήνες χωρίς επαφή μου φαίνεται complicated af. Σχετικά με το Debug. Το αρχείο είναι στο ίδιο directory, το βρίσκει λοιπόν, την διάταξη που του δίνω να διαβάσει έχει, άρα ούτε αυτό φταιέι. wtf.
Moderators Kercyn Δημοσ. 10 Σεπτεμβρίου 2016 Moderators Δημοσ. 10 Σεπτεμβρίου 2016 Κάνεις ist.is_open(), το περνάει επιτυχώς αλλά δεν στο διαβάζει; Τι ακριβώς δε δουλεύει;
defacer Δημοσ. 10 Σεπτεμβρίου 2016 Δημοσ. 10 Σεπτεμβρίου 2016 Ξεκίνα απο δω, πριν και μετά το ist >> type: http://www.cplusplus.com/reference/ios/ios/good/
Dinos_12345 Δημοσ. 10 Σεπτεμβρίου 2016 Μέλος Δημοσ. 10 Σεπτεμβρίου 2016 Κάνεις ist.is_open(), το περνάει επιτυχώς αλλά δεν στο διαβάζει; Τι ακριβώς δε δουλεύει; cout << ist.is_open() << ist.good() << ist.bad() << ist.fail(); output 1100 @defacer, αν κάνεις overload τον operator>> για το input stream δεν θα είναι στα πάντα μετά αφού δεν θα γίνει μέσα σε κάποια κλάση;
defacer Δημοσ. 10 Σεπτεμβρίου 2016 Δημοσ. 10 Σεπτεμβρίου 2016 cout << ist.is_open() << ist.good() << ist.bad() << ist.fail(); output 1100 @defacer, αν κάνεις overload τον operator>> για το input stream δεν θα είναι στα πάντα μετά αφού δεν θα γίνει μέσα σε κάποια κλάση; Ο κώδικας γενικά δουλεύει οπότε δεν είμαι σίγουρος τι πρόβλημα έχεις. Μάλλον είναι κάτι χαζό. std::istream& operator>>(std::istream& is, tax_declaration& d) Κάνεις overload τον operator για την περίπτωση που το δεξί όρισμα είναι tax_declaration&. Αν γράψεις cin >> my_string το overload που έγραψες δεν κάνει apply οπότε δεν πειράζεις τίποτα από αυτά που ήδη δουλεύουν. Αυτό ρωτάς;
Dinos_12345 Δημοσ. 10 Σεπτεμβρίου 2016 Μέλος Δημοσ. 10 Σεπτεμβρίου 2016 (επεξεργασμένο) Ο κώδικας γενικά δουλεύει οπότε δεν είμαι σίγουρος τι πρόβλημα έχεις. Μάλλον είναι κάτι χαζό. std::istream& operator>>(std::istream& is, tax_declaration& d) Κάνεις overload τον operator για την περίπτωση που το δεξί όρισμα είναι tax_declaration&. Αν γράψεις cin >> my_string το overload που έγραψες δεν κάνει apply οπότε δεν πειράζεις τίποτα από αυτά που ήδη δουλεύουν. Αυτό ρωτάς; Yep, αυτό ακριβώς. Edit: Λοιπόν έκανα αυτό void input_file(string name){ char line[100]; char buffer[100]; char date[16]; char type[2]; float income; ifstream ist(name.c_str()); while(ist.getline(line, 100)){ sscanf(line, "%s, %[^','], %f, %s,%[^',']", type,buffer, &income, date, buffer); cout << type << ' ' << income << ' ' << date << endl; } } Το οποίο στο μεγαλύτερο του μέρος δουλεύει, όμως όταν τυπώνει, μου βγάζει αυτό Πιστεύω πως είναι επειδή ο buffer μέσα έχει σκουπίδια μετά το πέρας αυτού που διάβασε, οπότε και τα τυπώνει. FIXED sscanf(line, "%[^','], %f, %[^',']", type, &income, date); Επεξ/σία 10 Σεπτεμβρίου 2016 από Dinos_12345
gon1332 Δημοσ. 13 Σεπτεμβρίου 2016 Δημοσ. 13 Σεπτεμβρίου 2016 Η τελευταία έκδοσή σου είναι καθάρα κώδικας C. Απλά αντικατέστησες τη fgets με getline.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα