kath Δημοσ. 24 Σεπτεμβρίου 2006 Δημοσ. 24 Σεπτεμβρίου 2006 Καλημερα σ'ολους. Μπορει καποιο καλο παιδι , να μου γραψει ενα μικρο παραδειγμα οπου να γινεται αντιγραφη επιλεγμενου κομματιου απο ενα string? Παραδειγμα: Εχω αυτη τη function, οπου θα της δινω ενα string ,και στις υπολοιπες δυο παραμετρους θα οριζω το αρχικο κειμενο οπου θα γινεται η αντιγραφη , αλλα και το τελικο κειμενο: int seperate(string DATA,string START_TEXT,string END_TEXT) { return optimized_data; } και μετα απο τη κεντρικη function θα το καλω ετσι: test_data=000ANTIGRAPSE002200ANTIGRAFHTELOS; mystring =seperate(test_data,"ANTIGRAPSE","ANTIGRAFHTELOS") printf(mystring); //και λογικα επιστρεφει 002200
Directx Δημοσ. 24 Σεπτεμβρίου 2006 Δημοσ. 24 Σεπτεμβρίου 2006 Η ρουτίνα που ακολουθεί βασίζεται στην βιβλιοθήκη C++ της Dinkumware STL που παρέχει η δωρεάν έκδοση του Borland Turbo C++ Explorer (πρώην Borland C/C++ Builder ή Borland Developer Studio 2006) http://www.turboexplorer.com/. Πρώτη μας ενέργεια είναι να εντοπίσουμε την αρχή (ANTIGRAPSE) και το τέλος (ANTIGRAFHTELOS ) των δεδομένων που μας ενδιαφέρουνε (strData).. Η εντολή .find αναζητά την πρώτη εμφάνιση ενός string που ξεκινά από ορισμένη θέση (στην περίπτωση μας είναι η θέση μηδέν -δηλαδή η αρχή του string) επιστρέφοντας την θέση του πρώτου του χαρακτήρα (stStartText) ή npos εάν δεν βρεθεί τίποτα. Η εντολή .rfind αντίστροφα αναζητά την τελευταία εμφάνιση ενός string μέχρι ορισμένη θέση (στην περίπτωση μας είναι ο τελευταίος χαρακτήρας του string δηλαδή ολόκληρο το string -strData.size()) επιστρέφοντας την θέση του πρώτου του χαρακτήρα (stEndText) ή npos εάν δεν βρεθεί τίποτα. Ακολουθεί έλεγχος των stStartText και stEndText (==npos) για να δούμε εάν έχουν βρεθεί εντός των δεδομένων τα string που οριοθετούν τα ωφέλημα στοιχεία, εάν δεν βρεθεί τίποτε επιστρέφουμε ένα κενό string (το έχουμε ήδη προετοιμάσει με την εντολή .clear και για μετέπειτα χρήση από την .append). Εάν αντίθετα έχουμε βρει τα όρια των δεδομένων που μας ενδιαφέρουν τότε επειδή η .find επιστρέφει την θέση του πρώτου χαρακτήρα που εμφανίζεται στο string που αναζητά προσθέτουμε συνολικά το μέγεθος του (stStartText+=strStartText.size()) ώστε να εντοπίσουμε την θέση που τελειώνει και αρχίζουν τα δεδομένα που μας ενδιαφέρουν. Τέλος προσθέτουμε στο strOurData με την εντολή .append τα δεδομένα που μας ενδιαφέρουνε ξεκινώντας την προσθήκη από την θέση stStartText με μέγεθος stEndText-stStartText και το επιστρέφουμε (return strOurData). ΠΡΟΣΟΧΗ: Προτιμώ την ρουτίνα .append για την προσθήκη των δεδομένων στο stOurData αντίθετα από την πιο λογική .copy διότι η πρώτη στην υλοποίηση της χρησιμοποιεί string ενώ η δεύτερη στην υλοποίηση του Turbo C++ Explorer χρησιμοποιεί char*. > string Seperate(string strData,string strStartText,string strEndText) { // Seperate function -DIRECTX- string::size_type stStartText= strData.find(strStartText,0), stEndText= strData.rfind(strEndText,strData.size()); string strOurData; strOurData.clear(); if(stStartText==string::npos || stEndText==string::npos) return strOurData; stStartText+=strStartText.size(); strOurData.append(strData,stStartText,stEndText-stStartText); return strOurData; } Υ.Γ. Όπως πάντα μπορεί να υπάρχουν Bugs.. Καλή συνέχεια.
kath Δημοσ. 24 Σεπτεμβρίου 2006 Μέλος Δημοσ. 24 Σεπτεμβρίου 2006 Αψογος οπως παντα! Το δοκιμασα , και κανει ακριβως αυτο που θελω!...να΄σαι καλα
kath Δημοσ. 24 Σεπτεμβρίου 2006 Μέλος Δημοσ. 24 Σεπτεμβρίου 2006 Εχω ακομα μια μικρη ερωτηση, και την κανω εδω για να μην ανοιγω νεο θεμα χωρις λογο. Θελω να προσθεσω σε μια string array με ογκο δεδομενων 1500 , μερικες γραμμες απο ενα αρχειο. Ο σωστος τροπος ειναι ετσι: for (int z=0;z<=10;z++) { file_op.getline(temp,500); ARR[z]=temp; } ή ετσι: for (int z=0;z<=10;z++) { file_op.getline(temp,500)[z]; ARR[z]=temp; } ή υπαρχει κατι καλυτερο?
kath Δημοσ. 25 Σεπτεμβρίου 2006 Μέλος Δημοσ. 25 Σεπτεμβρίου 2006 Δυστυχως το προγραμμα crashaρει με το Loop :/
kath Δημοσ. 25 Σεπτεμβρίου 2006 Μέλος Δημοσ. 25 Σεπτεμβρίου 2006 Το βρηκα! : ifstream f("file") f.open int z=-1; while (!file.eof()) { z++; getline(file,ARRAY[z]); }
Directx Δημοσ. 25 Σεπτεμβρίου 2006 Δημοσ. 25 Σεπτεμβρίου 2006 Το δοκιμασα , και κανει ακριβως αυτο που θελω!...να΄σαι καλα Σε ευχαριστώ πολύ, καλή συνέχεια
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.