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

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

Δημοσ.

Ένα απλό αρχείο προσπαθώ να διαβάσω σε 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;
}

 

Βλέπετε κάποιο λάθος? Στον ίδιο φάκελο έχω και το αρχείο και τον κώδικα

Δημοσ.

Προσπαθώ να διαβάσω μια προταση η οποία ειναι καταχωρημένη σε ένα 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;
}

Δημοσ.

Σχετικά με τον διαχωρισμό των περιεχομένων της αλφαριθμητικής ακολουθίας θα μπορούσες να χρησιμοποιήσεις την 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..

 

Δημοσ.

Όλα αυτά δεν είναι 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.

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

Όλα αυτά δεν είναι 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;
}

 

Επεξ/σία από Directx
Δημοσ.

To ξεχασμένο #include<string> είναι mea culpa, τα πέταξα στο ideone και έτυχε να κάνει compile. Κανονικά θα έπρεπε να υπάρχει όπως λες, αν και τα #include της standard library είναι από τα πράγματα που προσωπικά δεν τα αναφέρω (όπως παραπάνω) γιατί εννοούνται.

 

Για το auto, επίτηδες επιλέγω C++11 syntax επειδή υπάρχει και επειδή διαφορετικά δε θα μάθαινα C++11 ποτέ.

Δημοσ.
Για το auto, επίτηδες επιλέγω C++11 syntax επειδή υπάρχει και επειδή διαφορετικά δε θα μάθαινα C++11 ποτέ.

Ok, δεν έχω ασχοληθεί.

Δημοσ.

Ok, δεν έχω ασχοληθεί.

 

Δες εδώ. Σημαντική σημείωση για να μη χαθεί η μπάλα: το auto υπήρχε "από πάντα" (υπάρχει και στη C IIRC) αλλά ήταν storage class specifier και συγκεκριμένα άχρηστο (πιθανότατα αυτός είναι ο λόγος που δεν έκανε compile το αρχικό -- αναγνωρίζει το auto αλλά με άλλη σημασία). Στη C++11 είναι keyword και σημαίνει "ο,τι είναι το static type του expression με το οποίο κάνω initialize".

Δημοσ.

 

 

Δες εδώ. Σημαντική σημείωση για να μη χαθεί η μπάλα: το auto υπήρχε "από πάντα" (υπάρχει και στη C IIRC) αλλά ήταν storage class specifier και συγκεκριμένα άχρηστο (πιθανότατα αυτός είναι ο λόγος που δεν έκανε compile το αρχικό -- αναγνωρίζει το auto αλλά με άλλη σημασία). Στη C++11 είναι keyword και σημαίνει "ο,τι είναι το static type του exp<b></b>ression με το οποίο κάνω initialize".

Και εμένα όταν είδα το auto εκεί πήγε το μυαλό μου, στην έννοια που είχε επί C, τώρα βλέπω ότι μπαίνει ξανά στο παιχνίδι.

Δημοσ.

Και μιας που είμαστε εδώ, να πω ότι αρχικά το έγραψα το loop ως

 

>for(auto word : words) cout << word << endl;

 

(range-based for) αλλά ο GCC < 4.6 που έχει στο ideone δεν το υποστηρίζει.

Δημοσ.

Μάλιστα, το x11 έχει προχωρήσει πολύ το θέμα - η σύνταξη θυμίζει Java και C#/foreach.

 

Κρίμα που ο C++ Builder που διαθέτω δεν υποστηρίζει το πρότυπο.

Δημοσ.

 

Αυτά δεν είναι τίποτα, υπάρχουν πολλά υπερτεραστιότερα νέα features, τόσα που δεν ξέρω απο πού να ξεκινήσω. Ας πούμε από anonymous functions επιτέλους μα το Μπελενος...

 

http://ideone.com/6Vagh (ξεκίνα να διαβάζεις από τη main, το N queens solver αυτό καθαυτό δεν έχει τόση σημασία)

 

 

Δημοσ.

Όλα αυτά δεν είναι 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>()
       );

  • Like 2
Δημοσ.

Ωραίος!

 

Πάντως τα περιεχόμενα του <algorithm> είναι σούπερ σημαντικά στη c++ οπότε δε μετανοιώνω που το έγραψα με copy().

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

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

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

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

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

Σύνδεση

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

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