Mulla on ongelma. Ja se on sellainen, että C++ ei anna minun itse oikein määritellä tiedostoa, jonka haluan avata, jollen määrittele sitä tuolla lähdökoodissa. Ja tarkoituksena olisi saada auki tiedosto, josta osa on ohjelman käyttäjän nimi.
Tässä tulee se osa koodista, jolla määritellään se tiedosto:
cout << "Name: "; cin >> namesyot; const char* accountfile = "\\Accounts\\" + namesyot + ".acf"; ifstream GetAccount(accountfile);
Missä vika???
Vika on rivissä const char* accountfile = "\\Accounts\\" + namesyot + ".acf";
Kääntäjänkin pitäisi tuosta valittaa.
Voi tehdä vaikkapa näin:
char accountfile[32]; sprintf(accountfile, "\\Accounts\\%s.acf", namesyot);
http://www.cppreference.com/stdio_details.html#printf
http://www.cppreference.com/stdio_details.html#sprintf
Voisit kertoa mitä erroreita tulee.
char:ia ei voi tietääkseni määritellän näin "jotain" + str + "jotain muuta";
#include <string> cout << "Name: "; cin >> input; string AccFile = "\\Accounts\\" + input+ ".acf"; ifstream GetAccount(AccFile);
Et voi ajon aikana sijoittaa vakiomuuttujaan (const) arvoa.
Jätä const pois niin tuo taitaa toimia. Funktioden parametreissa usein näkee tuon const char * määreen, mutta tällöin tarkoitetaan, että merkkijonon arvoa ei voi muuttaa funtion sisällä, ei sitä, että merkkijonomuuttuja, jonka funktiolle syöttää parametrina pitäisi olla vakio.
Lisäksi ifstream huolii vain c-tyylisiä merkkijonoja. Käytä stringin metodia c_str(), joka palauttaa sellaisen.
ifstream GetAccount((char*)AccFile.c_str());
Kokeilin tuota sprintf -juttua ja se antoi kääntää sen, kun aijoin ohjelman se ohjelma kaatui heti, kun se rupesi etsimään sitä tiedostoa.
Tässä teille koko koodi (osittain vajaata, mutta tähän asiaan liittyvä koodi on valmis):
#include <iostream> #include <string> #include <fstream> using namespace std; int main() { const int whi = 1; int login = 0; char ch = 0; char* namesyot = 0; char* name = 0; char* password = 0; char* passwordsyot = 0; string comm; cout << endl << endl << "Account test by appina" << endl; do { cout << endl << "[L]ogin" << endl << "[C]reate Account" << endl << endl; cin >> ch; if(ch == 'l') { cout << "Name: "; cin >> namesyot; char accountfile[32]; sprintf(accountfile, "\\Accounts\\%s.acf", namesyot); ifstream GetAccount(accountfile); if(!GetAccount) { cout << endl << "No such account avaible!" << endl; } name = namesyot; GetAccount >> password; cin >> passwordsyot; if(passwordsyot == password) { login = 1; } else { cout << endl << "Incorrect password!" << endl; } } } while(login == 0); do { cout << ">> "; cin >> comm; } while(whi == 1); return(0); }
Missä vika???
Miksi ei voi käyttää stringejä?
Otapa nimestä kuitenkin ensimmäinen kenoviiva pois:
sprintf(accountfile, "Accounts\\%s.acf", namesyot);
Jos kansio olisi esim. "C:\", edellinen versiosi saisi tiedostonimekseen "C:\\Accounts\joku.acf", vaikka polkuna pitäisi olla "C:\Accounts\joku.acf".
adeRide kirjoitti:
Missä vika???
char* namesyot = 0; cin >> namesyot;
Esimerkiksi tuossa. cin ei käsittääksi automaattisesti varaa muistia merkkijonotaulukolle, joten tuossa tapahtunee perinteinen NullPointerException :)
Vaihda noi merkkijonot string tyyppisiksi. string:it hoitaa muistinvaraamisen automaagisesti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.