MauriDalia Δημοσ. 7 Νοεμβρίου 2012 Δημοσ. 7 Νοεμβρίου 2012 Ένα απλό αρχείο προσπαθώ να διαβάσω σε c++ και όλο μου βγάζει ότι failed > #include <fstream> #include <iostream> #include <cstring> using std::string; using namespace std; using std::ifstream; int main () { ifstream infile; infile.open ("input.txt"); if (infile.is_open()) { cout<<"OK\n"; } else { cout << "Error opening file \n"; } system("pause"); return 0; } Βλέπετε κάποιο λάθος? Στον ίδιο φάκελο έχω και το αρχείο και τον κώδικα
MauriDalia Δημοσ. 9 Νοεμβρίου 2012 Μέλος Δημοσ. 9 Νοεμβρίου 2012 Προσπαθώ να διαβάσω μια προταση η οποία ειναι καταχωρημένη σε ένα string και να την χωρίσω σε λέξεις ... Πρέπει η προταση να αποθηκεύεται σε τύπο String και ο μόνος τρόπος για να το κάνω που γνωρίζω είναι η strtok αλλά..θέλω οι ξεχωριστές λέξεις να αποθηκεύονται σε ένα πίνακα strings πάλι..δεν θέγλω να χρησιμοποιήσω chars..έχω κάνει αυτό αλλα δεν βγάζω άκρη. Καμιά ιδέα??? > // strings and c-strings #include <iostream> #include <cstring> #include <string> #include <cstring> using namespace std; int main () { string str1 ("Please split this phrase into tokens"); char *ptr1=0; char *p; int length=str1.length(); cout << "To mikos tou string einai : "<<length<<endl; char *ptr2 = new char [length+1]; str1.copy(ptr2,length,0); ptr2[length]='\0'; cout<<"String is :"<<str1<<endl; cout<<"Me pointer einai: "<<str1.c_str()<<endl; // cstr now contains a c-string copy of str int count=0; p=strtok (ptr2," "); while (p!=NULL) { int count; cout << p <<endl; p=strtok(NULL," "); count++; cout<<"Brike "<<count<<" kena"<<endl; } delete[] ptr2; system("pause"); return 0; }
Directx Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Σχετικά με τον διαχωρισμό των περιεχομένων της αλφαριθμητικής ακολουθίας θα μπορούσες να χρησιμοποιήσεις την string.find_first_of ως εξής.. 0. Εξασφαλίζεις ότι η αλφαριθμητική ακολουθία ολοκληρώνεται με κενό. 1. Βρίσκεις την θέση του πρώτου κενού της ακολουθίας (nTokenPos) ή string::npos αν δεν υπάρχει οπότε τότε διακόπτεις. 2. Αποθηκεύεις (στο strToken μέσο string.substr) από την αρχή (0) του αλφαριθμητικού ως την θέση nTokenPos που επέστρεψε η string.find_first_of. 3. Διαγράφεις το αποθηκευμένο αλφαριθμητικό από την ακολουθία από την αρχή ως συν μια θέση από την θέση nTokenPos. 4. Αν το strToken δεν είναι μηδενικού μεγέθους το αποθηκεύεις σε ένα vector. Κώδικας: >#include <iostream> #include <string> #include <vector> using namespace std; int main(void) { string strIn = "Please split this phrase into tokens"; int nTokenPos; // strIn should always end with space. strIn.append(" "); // Tokenize strIn into tokVector.. vector<string> tokVector; while((nTokenPos = strIn.find_first_of(" ", 0)) != string::npos) { const string strToken = strIn.substr(0, nTokenPos); // Ignore empty tokens.. if(strToken.length()) { tokVector.push_back(strToken); cout << tokVector.size() - 1<<". "<<"\""<<tokVector.back()<<"\""<<endl; } // Remove token from strIn.. strIn.erase(0, nTokenPos + 1); } cout << endl<<"Press Enter to exit.."; cin.get(); return 0; } ΕΞΟΔΟΣ: >0. "Please" 1. "split" 2. "this" 3. "phrase" 4. "into" 5. "tokens" Press Enter to exit..
defacer Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Όλα αυτά δεν είναι C++. C++ είναι αυτό: >istream_iterator<string> it(infile), eof; vector<string> words; copy(it, eof, back_inserter(words)); Όπου infile χρησιμοποιείς όποιο stream σε βολεύει. Αν έχεις την είσοδο σε string (που δε χρειάζεται βέβαια όταν θέλεις να διαβάσεις από αρχείο) τότε το infile θα είναι ένα std::istringstream. Για να καταλάβεις πώς δουλεύει πρέπει να διαβάσεις περι istream_iterator, copy και back_inserter. Και να μπεις στη φιλοσοφία ότι c++ == iterators. See it in action. 3
Directx Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 (επεξεργασμένο) Όλα αυτά δεν είναι C++. C++ είναι αυτό: >istream_iterator<string> it(infile), eof; vector<string> words; copy(it, eof, back_inserter(words)); Όπου infile χρησιμοποιείς όποιο stream σε βολεύει. Αν έχεις την είσοδο σε string (που δε χρειάζεται βέβαια όταν θέλεις να διαβάσεις από αρχείο) τότε το infile θα είναι ένα std::istringstream. Για να καταλάβεις πώς δουλεύει πρέπει να διαβάσεις περι istream_iterator, copy και back_inserter. Και να μπεις στη φιλοσοφία ότι c++ == iterators. See it in action. Ωραίο, απλά πρόσθεσε ένα #include <string> για να κάνει compile και σε C++ Builder & VC++ 2008. Επίσης άλλαξε το "auto" σε "vector<string>::iterator" διότι οι δυο μεταφραστές δεν το δέχονται. Ακολουθεί μια έκδοση συμβατή με VC++ 2008 και C++ Builder: > #include <iostream> #include <iterator> #include <vector> #include <string> using namespace std; int main() { vector<string> words; copy(istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(words)); for (vector<string>::iterator i = words.begin(); i != words.end(); ++i) cout << *i << endl; return 0; } Επεξ/σία 9 Νοεμβρίου 2012 από Directx
defacer Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 To ξεχασμένο #include<string> είναι mea culpa, τα πέταξα στο ideone και έτυχε να κάνει compile. Κανονικά θα έπρεπε να υπάρχει όπως λες, αν και τα #include της standard library είναι από τα πράγματα που προσωπικά δεν τα αναφέρω (όπως παραπάνω) γιατί εννοούνται. Για το auto, επίτηδες επιλέγω C++11 syntax επειδή υπάρχει και επειδή διαφορετικά δε θα μάθαινα C++11 ποτέ.
Directx Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Για το auto, επίτηδες επιλέγω C++11 syntax επειδή υπάρχει και επειδή διαφορετικά δε θα μάθαινα C++11 ποτέ. Ok, δεν έχω ασχοληθεί.
defacer Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Ok, δεν έχω ασχοληθεί. Δες εδώ. Σημαντική σημείωση για να μη χαθεί η μπάλα: το auto υπήρχε "από πάντα" (υπάρχει και στη C IIRC) αλλά ήταν storage class specifier και συγκεκριμένα άχρηστο (πιθανότατα αυτός είναι ο λόγος που δεν έκανε compile το αρχικό -- αναγνωρίζει το auto αλλά με άλλη σημασία). Στη C++11 είναι keyword και σημαίνει "ο,τι είναι το static type του expression με το οποίο κάνω initialize".
Directx Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Δες εδώ. Σημαντική σημείωση για να μη χαθεί η μπάλα: το auto υπήρχε "από πάντα" (υπάρχει και στη C IIRC) αλλά ήταν storage class specifier και συγκεκριμένα άχρηστο (πιθανότατα αυτός είναι ο λόγος που δεν έκανε compile το αρχικό -- αναγνωρίζει το auto αλλά με άλλη σημασία). Στη C++11 είναι keyword και σημαίνει "ο,τι είναι το static type του exp<b></b>ression με το οποίο κάνω initialize". Και εμένα όταν είδα το auto εκεί πήγε το μυαλό μου, στην έννοια που είχε επί C, τώρα βλέπω ότι μπαίνει ξανά στο παιχνίδι.
defacer Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Και μιας που είμαστε εδώ, να πω ότι αρχικά το έγραψα το loop ως >for(auto word : words) cout << word << endl; (range-based for) αλλά ο GCC < 4.6 που έχει στο ideone δεν το υποστηρίζει.
Directx Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Μάλιστα, το x11 έχει προχωρήσει πολύ το θέμα - η σύνταξη θυμίζει Java και C#/foreach. Κρίμα που ο C++ Builder που διαθέτω δεν υποστηρίζει το πρότυπο.
defacer Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Αυτά δεν είναι τίποτα, υπάρχουν πολλά υπερτεραστιότερα νέα features, τόσα που δεν ξέρω απο πού να ξεκινήσω. Ας πούμε από anonymous functions επιτέλους μα το Μπελενος... http://ideone.com/6Vagh (ξεκίνα να διαβάζεις από τη main, το N queens solver αυτό καθαυτό δεν έχει τόση σημασία)
παπι Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Όλα αυτά δεν είναι C++. C++ είναι αυτό: >istream_iterator<string> it(infile), eof; vector<string> words; copy(it, eof, back_inserter(words)); Όπου infile χρησιμοποιείς όποιο stream σε βολεύει. Αν έχεις την είσοδο σε string (που δε χρειάζεται βέβαια όταν θέλεις να διαβάσεις από αρχείο) τότε το infile θα είναι ένα std::istringstream. Για να καταλάβεις πώς δουλεύει πρέπει να διαβάσεις περι istream_iterator, copy και back_inserter. Και να μπεις στη φιλοσοφία ότι c++ == iterators. See it in action. Ουτε copy back_inserter θες. Ο constructor του vector παιρνει first & last iterators αρα μια μινιμαλ λυση > std::vector<std::string> result( std::istream_iterator<std::string>(stream), std::istream_iterator<std::string>() ); 2
defacer Δημοσ. 10 Νοεμβρίου 2012 Δημοσ. 10 Νοεμβρίου 2012 Ωραίος! Πάντως τα περιεχόμενα του <algorithm> είναι σούπερ σημαντικά στη c++ οπότε δε μετανοιώνω που το έγραψα με copy().
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα