Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tiedoston lataaminen muuttuvalla tiedostonimellä

Sivun loppuun

AdeRide [03.12.2004 14:33:10]

#

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???

acorn [03.12.2004 14:37:59]

#

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

Linkku [03.12.2004 14:38:02]

#

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);

FooBat [03.12.2004 14:40:35]

#

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.

Aruviel [03.12.2004 14:41:47]

#

Lisäksi ifstream huolii vain c-tyylisiä merkkijonoja. Käytä stringin metodia c_str(), joka palauttaa sellaisen.

ifstream GetAccount((char*)AccFile.c_str());

AdeRide [03.12.2004 15:03:52]

#

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???

Linkku [03.12.2004 15:06:27]

#

Miksi ei voi käyttää stringejä?

Metabolix [03.12.2004 15:52:24]

#

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".

FooBat [03.12.2004 18:32:25]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta