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

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

Δημοσ.

Έστω ότι έχουμε ένα αρχείο που έχει εγγραφές με μορφή

name, tax, income

Πως μπορώ να πάρω αυτές τις εγγραφές μία μία και να τις περάσω στα attributes ενός tax_declaration αντικειμένου;

Ξέρω πως γίνεται με την sscanf της C αλλά δεν ξέρω τι attributes να δώσω και πως.

Δημοσ.

Τελικά ήταν 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;
}
Δημοσ.

Γενικά μιλώντας μια καλή πρώτη προσέγγιση είναι να δηλώσεις μέσα στην 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.  :)

Δημοσ.

Το κάνω debug και βλέπω και την δική σου λύση, η οποία με μία πρώτη ματιά και μετά από 3 μήνες χωρίς επαφή μου φαίνεται complicated af.

Σχετικά με το Debug. Το αρχείο είναι στο ίδιο directory, το βρίσκει λοιπόν, την διάταξη που του δίνω να διαβάσει έχει, άρα ούτε αυτό φταιέι. wtf.

Δημοσ.

Κάνεις ist.is_open(), το περνάει επιτυχώς αλλά δεν στο διαβάζει; Τι ακριβώς δε δουλεύει;

cout << ist.is_open() << ist.good() << ist.bad() << ist.fail();

output 1100

@defacer, αν κάνεις overload τον operator>> για το input stream δεν θα είναι στα πάντα μετά αφού δεν θα γίνει μέσα σε κάποια κλάση;

Δημοσ.
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 οπότε δεν πειράζεις τίποτα από αυτά που ήδη δουλεύουν. Αυτό ρωτάς;

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

Ο κώδικας γενικά δουλεύει οπότε δεν είμαι σίγουρος τι πρόβλημα έχεις. Μάλλον είναι κάτι χαζό.

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 μέσα έχει σκουπίδια μετά το πέρας αυτού που διάβασε, οπότε και τα τυπώνει.

post-335185-0-96610500-1473515770_thumb.png

 

FIXED

sscanf(line, "%[^','], %f, %[^',']", type, &income, date);
Επεξ/σία από Dinos_12345

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

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

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

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

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

Σύνδεση

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

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