wolfakisevag Δημοσ. 5 Οκτωβρίου 2008 Δημοσ. 5 Οκτωβρίου 2008 παιδια γεια σας έχω ένα προβλημα έχω ένα αρχείο ca.txt με τα παρακάτω δεδομένα: 114\tab\tχανια\tdaklh 120 65490\t2821093156\t234567890 115\tab\tχανιαsvsv\tdaklh 120 65490\t2821093156\t234567890 116\tab\tχανιαv\tdaklh 120 65490\t2821093156\t234567890 τα οποία κάθε ένα είναι κωδικος,ονομα,,πόλη,διευθυνση,τηλέφωνο,αφμ θέλω αν ξέρει κανείς να μου γράψει συνάρτηση που να κάνει την εξής δουλειά να διαβάζει το αρχείο και να το μεταφέρει σε πίνακα με στοιχεια τυπου comagent. πιο συγκεκριμένα δεν θέλω να διαβάζει όλο το κείμενο μονομιάς αλλά στοιχείο στοιχείο. αν γνωρίζει κανείς ας με βοηθήσει μόνο με παράδειγμα κώδικα ευχαριστώ πολύ !
Dr.Fuzzy Δημοσ. 5 Οκτωβρίου 2008 Δημοσ. 5 Οκτωβρίου 2008 Για δειξε μας τι κωδικα εχεις γραψει μεχρι στιγμης, και το βλεπουμε.
evabb Δημοσ. 6 Οκτωβρίου 2008 Δημοσ. 6 Οκτωβρίου 2008 ωχ γτ μου θυμιζεις οδυνηρα πραματα. δειξε τι εχεις μεχρι τωρα οπως λεει και ο συμφορουμιτης
Directx Δημοσ. 6 Οκτωβρίου 2008 Δημοσ. 6 Οκτωβρίου 2008 Αν και δεν χρησιμοποιώ ιδιαίτερα τις classes της C++ STL για την διαχείριση αρχείων και strings εντούτοις με βάση το ζητούμενο έγραψα τον παρακάτω κώδικα ο οποίος ανοίγει το αρχείο που επιθυμείς (ορίζεται ως παράμετρος του προγράμματος –argv[1]), το διαβάζει γραμμή προς γραμμή (.getline) μέχρι το τέλος του αρχείου (.eof()), κάθε γραμμή την μετατρέπει σε ένα C++ STL String για εύκολη διαχείριση, ύστερα διαβάζει ανά \t (tab) το περιεχόμενο (token) κάθε string / γραμμής (5 tabs) στην μεταβλητή strToken και το εκτυπώνει στην οθόνη. Σε περίπτωση που βρεθεί κενή γραμμή, η ανάγνωση διακόπτεται. Κάθε γραμμή (row) οφείλει να τελειώνει με \t ώστε να διευκολύνεται η ανάγνωση μας ( += ʽ\tʼ). Το μέγεθος κάθε γραμμής ορίζεται σε BUFSIZ, ένα constant του stdio.h που ορίζει μια μεγάλη τιμή (συνήθως 512 χαρακτήρες), το stdio.h συμπεριλαμβάνεται δηλώνεται έμμεσα από τις βιβλιοθήκες της STL. Κάθε φορά που διαβάζουμε (.substr(0, find_first_of(ʽ\tʼ)) το περιεχόμενο της γραμμής μεταξύ της αρχής της –το μηδέν υποδηλώνει την αρχή του string, δηλαδή string[0] κτλ..) και του \t φροντίζουμε να διαγράφουμε ύστερα το περιεχόμενο αυτό (.erase) ώστε η επόμενη κλήση στην .substr να επιστρέψει το περιεχόμενο που ακολουθεί. Για περισσότερες λεπτομέρειες μελέτησε τα comments του κώδικα. > //-Read Text database (directx)---------------------------------------------- #include <string> #include <fstream> #include <iostream> // Special pragma (compiler) directives #ifdef __BORLANDC__ #pragma hdrstop #endif // Special pragma (compiler) directives #ifdef __BORLANDC__ #pragma argsused #endif int main(int argc, char* argv[]) { // Create a new fstream for input (read) std::fstream myStream(argv[1], std::fstream::in ); // Is fstream open? if(!myStream.fail()) { // BUFSIZ is defined in stdio.h (a large number) char szBuffer[bUFSIZ]; /* * strRecord will hold each of the database rows (lines), * strToken will hold each of the database row fields (tokens). */ std::string strRecord, strToken; // Redo until end of file while(!myStream.eof()) { // Read line (\n terminated) from file into szBuffer myStream.getline(szBuffer, sizeof(szBuffer)); // Store szBuffer char to string for easier manipulation strRecord = szBuffer; // Anything to process? (on empty line break!) if(!strRecord.length()) break; // Append trailing TAB character for structure consistency strRecord += '\t'; // Keep record count ... static int nRecordCount = 1; std::cout << "Record #" << nRecordCount++ << std::endl; // Tokenize each of the 5 fields of strRecord for(int nToken = 0; nToken < 5; nToken++) { // Copy each token into strToken (copy from start to first \t) strToken = strRecord.substr(0, strRecord.find_first_of('\t')); // Erase each token from strRecord (erase from start to first \t) strRecord.erase(0, strRecord.find_first_of('\t') + 1); // Output token std::cout << strToken << std::endl; } // Move stdout output to next record -newline. std::cout << std::endl; } // Close file myStream.close(); } else // Something went wrong!! std::cout << "Cannot open file for read!" << std::endl; // End of program std::cout << "Press Enter to resume..."; std::cin.get(); return 0; } //--------------------------------------------------------------------------- ΕΙΣΟΔΟΣ: > 114 χανια daklh 120 65490 2821093156 t234567890 115 χανιαsvsv daklh 120 65490 2821093156 234567890 116 χανιαv daklh 120 65490 2821093156 234567890 ΕΞΟΔΟΣ: > Record #1 114 χανια daklh 120 65490 2821093156 t234567890 Record #2 115 χανιαsvsv daklh 120 65490 2821093156 234567890 Record #3 116 χανιαv daklh 120 65490 2821093156 234567890 Press Enter to resume... Υ.Γ. Θεωρώ ότι το αρχείο διαβάζεται επιτυχώς εκτός και αν προκύψει eof, δεν ελέγχω για επιτυχία ή αστοχία του I/O συστήματος. Χρησιμοποιώ το std:: διότι αισθητικά το προτιμώ, διαφορετικά μπορείς να ορίσεις πριν το main μια using namespace std; εντολή ώστε να εξαλείψεις την χρήση του (αντί για std::cout -> cout κτλ). Το πρόγραμμα δοκιμάστηκε σε CodeGear Turbo C++ Explorer, μπορεί να περιέχει λάθει ή άλλες αβλεψίες. Σαφώς μπορεί να γραφθεί πολύ πιο διαφορετικά ώστε να εξαλειφθεί η ανάγκη για C char, αν και η χρήση του δεν θεωρείται (σε καμία περίπτωση) παράνομη στην C++ STL. Καλή τύχη!
parsifal Δημοσ. 6 Οκτωβρίου 2008 Δημοσ. 6 Οκτωβρίου 2008 [OFFTOPIC] Χιουμοράκι@Directx: Το παρακάτω Το πρόγραμμα δοκιμάστηκε σε CodeGear Turbo C++ Explorer, μπορεί να περιέχει λάθει ή άλλες αβλεψίες. ...γιατί δεν το βάζεις ως forum signature; Σήμα κατατεθέν! [/OFFTOPIC]
wolfakisevag Δημοσ. 11 Οκτωβρίου 2008 Μέλος Δημοσ. 11 Οκτωβρίου 2008 παιδια ευχαριστώ πολύ αλλά το έλυσα με άλλο τρόπο τα έκανα εισαγωγή από την κλαση πολύ πιο ευκολα από τα προηγούμενα κατεβατά!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.