planelover Δημοσ. 10 Μαρτίου 2009 Δημοσ. 10 Μαρτίου 2009 Την καλησπέρα μου σε όλους, Είμαι καινούριος στον προγραμματισμό (C++) και έχω μια απορία για ένα πρόγραμμα που θέλω να φτιάξω...: Θέλω ένα πρόγραμμα που να διαβάζει κάτι από ένα .txt, να το αποθηκεύει στη μνημη και κατόπιν να τυπώνει στο τέλος του .txt τον αριθμό, που έχει ήδη διαβάσει, αυξημένο κατά 1. Για παράδειγμα, στο txt έχω ενότητες που λέγονται: "[fltsim.1], [fltsim.2]" κλπ. Αυτό που θέλω να κάνω εγώ είναι να διαβάσω ποιο είναι το τελευταίο νούμερο (στην προκειμένη περίπτωση το 2) και να τυπώσει από κάτω "[fltsim.x+1]" όπου x=ο τελευταίος αριθμός. Ευχαριστώ εκ των προτέρων!
Wise_One Δημοσ. 10 Μαρτίου 2009 Δημοσ. 10 Μαρτίου 2009 Νομίζω ότι αυτό βοηθάει. Βλέπεις ποιές μεθόδους θα χρειαστείς, μάλλον θα πρέπει να δουλέψεις και με Regular Expressions για να βρεις το String που θες και μετά για να γράψεις στο τέλος του αρχείου είναι εύκολο. Ελπίζω να μη λέω βλακείες γιατί δεν ασχολούμαι με C++, απλά σαν ιδέα μου φαίνεται σωστή. Anyway, καλή τύχη.
Directx Δημοσ. 11 Μαρτίου 2009 Δημοσ. 11 Μαρτίου 2009 Την καλησπέρα μου σε όλους, Είμαι καινούριος στον προγραμματισμό (C++) και έχω μια απορία για ένα πρόγραμμα που θέλω να φτιάξω...: Θέλω ένα πρόγραμμα που να διαβάζει κάτι από ένα .txt, να το αποθηκεύει στη μνημη και κατόπιν να τυπώνει στο τέλος του .txt τον αριθμό, που έχει ήδη διαβάσει, αυξημένο κατά 1. Για παράδειγμα, στο txt έχω ενότητες που λέγονται: "[fltsim.1], [fltsim.2]" κλπ. Αυτό που θέλω να κάνω εγώ είναι να διαβάσω ποιο είναι το τελευταίο νούμερο (στην προκειμένη περίπτωση το 2) και να τυπώσει από κάτω "[fltsim.x+1]" όπου x=ο τελευταίος αριθμός. Ευχαριστώ εκ των προτέρων! Μπορείς να διαβάσεις κάθε γραμμή του αρχείου κειμένου με την βοήθεια της ifstream.getline. Όταν διαβάζεις μια γραμμή που έχει ικανό μέγεθος (για παράδειγμα μεγαλύτερο από 4 χαρακτήρες), ξεκινά (at) με τον χαρακτήρα [ και τελειώνει με τον χαρακτήρα ] και περιέχει τον χαρακτήρα (find) . αμέσως μετά τον χαρακτήρα [ και πριν τον χαρακτήρα ] έχοντας δίπλα από το . έναν αριθμητικό χαρακτήρα (0 ως 9) μπορείς να θεωρείς ότι πρόκειται για την τελευταία ενότητα αποθηκεύοντας την σε μια μεταβλητή string (strLastSection). Μόλις διαβάσεις όλες τις γραμμές του αρχείου (while) και εφόσον η μεταβλητή αυτή περιέχει κάποιες πιθανόν χρήσιμες πληροφορίες μπορείς με την βοήθεια των rfind & find να εντοπίσεις το που ακριβός αρχίζει και τελειώνει ο αριθμός της ενότητας μέσα στην γραμμή ώστε να τον αντιγράψεις (copy) σε μια άλλη μεταβλητή κειμένου (char szLine). Ύστερα αφού εξασφαλίσεις ότι ο αριθμός είναι καθαρός, δηλαδή δεν περιέχει μη αριθμητικούς χαρακτήρες, μπορείς με την βοήθεια της istringstream να τον μετατρέψεις σε Integer ώστε τελικά να τον αυξήσεις και να εκτυπώσεις την νέα ενότητα. > //-Read File & Calculate new Header value (c) directx------------------------ #include <iostream> #include <fstream> #include <string> #include <sstream> #include <locale> #ifdef __BORLANDC__ #pragma hdrstop #endif //--------------------------------------------------------------------------- using namespace std; #ifdef __BORLANDC__ #pragma argsused #endif int main(int argc, char* argv[]) { if(argc == 1) cout << "No input file specified!" << endl; else { // Open file for read ifstream File(argv[1]); if(File.is_open()) { int nLastSection = 0; char szLine[bUFSIZ]; string strLastSection; // Read each line to szLine while((File.getline(szLine, sizeof(szLine)))) { // Convert char Line to C++ string Line string strLine = szLine; // Keep Last valid line ([ & ]) stored to strLastSection if(strLine.length() > 4 && strLine.at(0) == '[' && strLine.at(strLine.length() - 1) == ']') { // Valid line should have a dot and after that a number .123 .. if(strLine.find(".", 0) > 0 && strLine.find(".", 0) < strLine.at(strLine.length() - 1) && isdigit(strLine.at(strLine.find(".", 0) + 1))) { // Copy LastSection number to nLastSection cout << (strLastSection = szLine) << endl; } } } // Process LastSection number (find it, increase it, print it) if(strLastSection.length() > 4) { int nDotPos = strLastSection.rfind(".", strLastSection.length()), nBracketPos = strLastSection.rfind("]", strLastSection.length()); // Clear szLine because copy does not include a \0 to destination memset(&szLine, 0, sizeof(szLine)); strLastSection.copy(szLine, (nBracketPos - 1) - nDotPos, nDotPos + 1); // Accept only numbers eg ".123]" instead of ".123a]" etc.. for(int nCharCount = 0; nCharCount < strlen(szLine); nCharCount++) if(!isdigit(szLine[nCharCount])) { File.close(); cout << "Type mismatch because of \"" + (string)szLine + "\""; return 1; } // Convert String to Integer with the help of istringstream class istringstream iStream(szLine); iStream >> nLastSection; // Print new header with increased number cout << "New Section:" << endl << "\t[fltsim." << nLastSection + 1 << "]" << endl; } File.close(); } else cout << "Cannot open file " << argv[1] << endl; } return 0; } //--------------------------------------------------------------------------- Είσοδος: > [fltsim.1] THIS IS FLTSIM1 [fltsim.2] THIS IS FLTSIM2 [fltsim.3] THIS IS FLTSIM3 [fltsim.4] THIS IS FLTSIM4 Έξοδος: > [fltsim.1] [fltsim.2] [fltsim.3] [fltsim.4] New Section: [fltsim.5] Σημείωση: Μπορείς να μετατρέψεις άμεσα ένα κείμενο σε αριθμό με την βοήθεια της istringstream ακόμα και αν το κείμενο περιέχει και μη αριθμητικούς χαρακτήρες (για παράδειγμα 1234αβγ) σε αυτή την περίπτωση όμως η μετατροπή θα διακοπή στον πρώτο μη αριθμητικό χαρακτήρα (1234αβγ -> 1234 ή 1α234 -> 1) δίχως να παρουσιασθεί κάποιο σφάλμα από την istringstream, για αυτό προτιμώ να κάνω έναν έλεγχο στο κείμενο που προορίζεται για αριθμός ώστε να εξασφαλίσω πως δεν περιέχει μη αριθμητικούς χαρακτήρες –σε περίπτωση τέτοια προτιμώ να σταματά με υπόδειξη λάθους παρά να συνεχίζει ακάθεκτο σε άλλες ενότητες (για αυτό ο έλεγχος είναι εκτός του while). Το πρόγραμμα ψάχνει απλά για κεφαλίδες τύπου [.N] ( > 4 ) δεν περιλαμβάνει έλεγχο για [fltsim.N]. Το πρόγραμμα γράφτηκε σε ET/CodeGear C++ Builder, μπορεί να περιέχει σφάλματα ή άλλες αβλεψίες. Επίσης δεν εγγυώμαι για την λειτουργία του σε άλλους C++ compilers. Καλή τύχη.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.