[ Zed Mc Jack @ 23.05.2008. 10:03 ] @
Nedavno sam počeo da učim C++ i to radeći iz dve knjige uporedo.
Prva je Thinking in C++, a druga Beginning C++ Game Programming, taman da spojim korisno i zanimljivo.

Elem, još sam na samom početku i u toku su lekcije iz petlji i slično, međutim s obzirom da dolazim iz sveta baza podataka i Visual FoxPro-a, neke mi stvari nisu jasne.

Evo jedne od njih...
Code:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    string words;
    int broj=0;
    vector <string> word;
    cout << "The word counter \n";
    
    ifstream in("The area of circle.cpp");
    while (in >> words){
    ++broj;
    }
    cout << "There are " << broj << " words in the program.";
    system("PAUSE");
}


Ja sam hteo da promenim program tako da umesto ovog određenog fajla, može da izbroji reči iz bilo kojeg fajla, koji mu korisnik unese. Pa sam tako izmenio kod da on sada izgleda ovako:
Code:

//Prethodni deo izostavljen
    string fajl, words;
    int broj=0;
    vector <string> word;
    cout << "The word counter \n\n";
    cout << "Enter the file name: ";
    cin >> fajl;
    ifstream in(fajl);
//ostatak izostavljen

I sada program puca i odbija kompajliranje na liniji
Code:
ifstream in(fajl);

sa porukom 16 C:\Dev-Cpp\Projekti\Word Counter.cpp no matching function for call to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(std::string&)'

Ako može neko da pojasni, šta ne valja i kako bi trebalo da glasi kod.
[ karas @ 23.05.2008. 15:05 ] @
Probaj da ime fajlu zadajes kao C string a ne preko C++ klase string, dakle sa
Code:

ifstream in(fajl.c_str());

[ Zed Mc Jack @ 23.05.2008. 21:09 ] @
OK, sada nema greške, ali ne radi kako treba, to jest, uvek izbroji 0 reči.
Proverio sam i problem su prazna mesta u imenu fajla.

Kako da se ovo prevaziđe?

Uzgred budi rečeno zašto C++ string klasa ima problem, a C_str() ne?
Zvuči mi kao metoda za obradu ulaznog stringa, ali možda grešim.
[ karas @ 24.05.2008. 10:24 ] @
Ne znam u čemu je problem, stavi kod.
fstream prihvata ime fajla kao C string a ne kao C++ klasu string - pogledaj dokumentaciju. string::c_str() vraća C string (opet vidi dokumentaciju) koji se onda može poslati fstream konstruktoru.
[ xeron @ 26.05.2008. 17:24 ] @
Ime filea se navodi kao const char* ... evo primjera
Citat:

ulazni file: test.txt
1 2 3 4 5


Code:

#include <iostream>
#include <fstream>
using namespace std;

int main(void){
    char file [256];
    cout<<"Unesite ime file-a: "<<endl;
    cin.getline(file, '\n');

    ifstream ulaz(file);
    int n;
    while( ulaz>>n )
        cout<<n<<endl;
    return 0;
}


...izlaz programa izgleda ovako

Citat:

./varfile
Unesite ime file-a:
test.txt
1
2
3
4
5
[ Zed Mc Jack @ 27.05.2008. 15:47 ] @
Kao što rekoh varijanta koju je predložio karas radi isto kao i ova nova varijanta koju je predložio xeron ali samo za fajlove koji nemaju prazna mesta u imenu fajla.
U svakom slučaju, hvala obojici na idejama.
[ karas @ 28.05.2008. 08:15 ] @
Sta je problem? Ne mozes da otvoris fajl koji ima space u imenu?
[ Zed Mc Jack @ 28.05.2008. 09:15 ] @
Da, kao što rekoh već.
[ karas @ 28.05.2008. 09:49 ] @
Probaj da space u imenu fajla zamenis sa \x20
Code:

fstream f("t\x20mp.txt");

ako je to problem.
[ Zed Mc Jack @ 28.05.2008. 10:29 ] @
Ok, mislim da je problem u tome što konzolni unos izgleda ne dozvoljava unos stringa sa space karakterom, ili mu on dođe kao terminator.
Oustalom...
Code:

string fajl;
cin >> fajl;
cout << fajl;


ako unesemo Word counter.cpp kao ime fajla.
cout će dati samo Word kao izlaz, što mi govori da je ovo ili nelegalna situacija ili se ovo ne obrađuje na pravi način, to jest ja ne znam da li uopšte može da se reši?
[ karas @ 28.05.2008. 11:02 ] @
Operator >> tretira belinu kao separator, koristi getline() umesto njega, vidi http://www.cppreference.com/cppstring/getline.html.
[ Zed Mc Jack @ 28.05.2008. 11:29 ] @
E, to je to, hvala.

Sada ceo program izgleda ovako:
Code:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    string fajl, words;
    int broj=0;
    vector <string> word;
    cout << "The word counter \n\n";
    cout << "Enter the file name: ";
    getline(cin,fajl) ;
    cout << endl << fajl << endl;
    ifstream in(fajl.c_str());
    while (in >> words){
   ++broj;
    }
    cout << "\nThere are " << broj << " words in the program.\n";
    system("PAUSE");
}


E, da , hvala i na onom linku, Fox ima odličan help gde je dovoljno obeležiti ključnu reč i stisnuti F1 i dobiješ odmah sve što ima u helpu na tu temu. Jasno mi je da je Dev-C++ free i obustavljen, ali mi svejedno nedostaje ova vrsta pomoći.
Navika je čudna stvar.