che pobrać od użytkownika ścieżkę pliku
plik.open("c:/lab1.txt",ios::in); kiedy podam taki kod to działa bez problemu
ale jak zmienie "" na zmienną string lol i pobiore ją to nie chce działać??
plik.open(lol,ios::in)
co robie źle???
che pobrać od użytkownika ścieżkę pliku
plik.open("c:/lab1.txt",ios::in); kiedy podam taki kod to działa bez problemu
ale jak zmienie "" na zmienną string lol i pobiore ją to nie chce działać??
plik.open(lol,ios::in)
co robie źle???
pobiore ją
Z internetu, od użytkownika, czy jak?
Rozwiń swoją myśl.
http://www.cplusplus.com/reference/string/string/c_str/
plik.open(lol.c_str(),ios::in)
Pewnie o to chodzi.
che aby po otwarciu konsoli mógł wpisać "c:/lab1.txt" i żeby wczytało ten plik
próbowałem zadeklarować zmienna string i pobrać ją ale niedziałało;/
Daj cały kod, jeśli moje nie działa.
po przerobieniu na coś takiego dalej nie działa albo ja nie wiem co wpisać w konsoli:/
po wpisaniu "c:/lab1.txt" powinno zadziałać czy inaczej trzeba to wpisać??
labirynt::labirynt()
{
maxX=20;
maxY=20;
fstream plik;
char t;
string lol;
czyLabirynt=true;
cin>>lol;
plik.open(lol.c_str(),ios::in);
if(!plik)
{
czyLabirynt=false;
cout<<"BLAD ZALADOWANIA PLIKU LABIRYNTU"<<endl;
}
if(czyLabirynt)
{
int i=0,j=0;
char t;
lab = new char*[maxY];
lab[0]=new char[maxX];
while(!plik.eof())
{
plik.get(t);
if((int)t==10)
{
i++;j=0;
lab[i]=new char[maxX];
continue;
}
lab[i][j]=t;
j++;
}
}
plik.close();
}
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
fstream plik;
string lol="";
cin>>lol;
if( lol[0] == '"' && lol[lol.size()-1] == '"' )
{
lol.erase(0,1);
lol.erase(lol.size()-1,1);
//cout << lol << endl;
}
plik.open(lol.c_str(),ios::in);
//plik.open("c:/a/a.txt",ios::in);
if(!plik)
{
cout<<"BLAD ZALADOWANIA PLIKU LABIRYNTU"<<endl;
}
else
{
cout<<"WSIO OKEJ"<<endl;
}
string x;
plik >> x;
cout <<x;
return 0;
}
U mnie działa, obojętnie, czy podam w " ", czy surowe. Jeśli się sypie, to dzięki dalszym operacjom.
dalej nie moge sobie poradzić;/ cały kod może ktoś mi wytłumaczy co źle robie?
#include <iostream>
#include <conio.h>
#include "labirynt.h"
using namespace std;
int main(void)
{
labirynt();
bool setXY=false;
labirynt lab;
while(!setXY)
{
setXY=lab.wskazStart();
system("cls");
}
lab.pokazLabirynt() ;
getch();
system("cls");
lab.szukajDrogi(-1,-1,0);
getch();
return 1;
}
#include <string>
struct labirynt
{
int pozX, pozY, maxX, maxY;
char **lab;
bool czyLabirynt;
labirynt();
void pokazLabirynt();
bool wskazStart();
void szukajDrogi(int,int,int);
~labirynt();
};
#include <iostream>
#include <fstream>
#include <conio.h>
#include "labirynt.h"
using namespace std;
labirynt::labirynt()
{
maxX=20;
maxY=20;
char t;
fstream plik;
string lol;
cin>>lol;
czyLabirynt=true;
plik.open(lol.c_str(),ios::in);
if(!plik)
{
czyLabirynt=false;
cout<<"BLAD ZALADOWANIA PLIKU LABIRYNTU"<<endl;
}
if(czyLabirynt)
{
int i=0,j=0;
char t;
lab = new char*[maxY];
lab[0]=new char[maxX];
while(!plik.eof())
{
plik.get(t);
if((int)t==10)
{
i++;j=0;
lab[i]=new char[maxX];
continue;
}
lab[i][j]=t;
j++;
}
}
plik.close();
}
void labirynt::pokazLabirynt()
{
if(!czyLabirynt)
{
cout<<"NIE WCZYTANO PLIKU NIE MA CZEGO OGLADAC"<<endl;
return;
}
int i,j;
char t;
for(i=0;i<maxX;i++)
{
for(j=0;j<maxX;j++)
{
t=lab[i][j];
if(t=='2')
cout <<" ";//(char)254;
else if(t=='1')
cout <<(char)177;
else if(t=='3')
cout <<(char)248;
else if(t=='4')
cout <<(char)227;
else
cout <<t;
}
cout<<"\n";
}
cout<<"LEGENDA*"<<endl;
cout<<(char)177<<" - SCIANA"<<endl;
cout<<(char)248<<" - WYJSCIE"<<endl;
cout<<(char)227<<" - START"<<endl;
}
bool labirynt::wskazStart()
{
if(!czyLabirynt)
{
cout<<"NIE WCZYTANO PLIKU NIE MA GDZIE I CZEGO SZUKAC"<<endl;
return false;
}
int x,y;
cout<<"Wskaz punt startu okreslajac jego wspolzedne X i Y"<<endl;
cout<<"Podaj wspolzedna X: ";
cin>>x;
cout<<"Podaj wspolzedna Y: ";
cin>>y;
if((x-1<0 || x-1>maxX-1) || (y-1<0 || y-1>maxY-1))
{
cout<<"PODALES NIEWLASCIWY ZAKRES"<<endl;
getch();
return false;
}
else
{
if(lab[y-1][x-1]=='2')
{
pozX=x-1;
pozY=y-1;
lab[y-1][x-1]='4';
return true;
}
else
{
cout<<"TRAFILES W W SCIANE"<<endl;
getch();
return false;
}
}
}
///FUNKCJA SZUKAJĄCA DROGI W LABIRYNCIE
void labirynt::szukajDrogi(int x,int y,int straz)
{
static int pY,pX, find;
int moz=0,biezX,biezY,str;
if(find==1)
return;
system("cls");
pokazLabirynt();
str=straz+1;
if(x==-1 || y==-1)
x=pozX,y=pozY;
pX=x;
pY=y;
while(moz<4)//dla danej opozycji mogą być max 4 drogi (góra dół lewo prawo)
{
//okreslenie mozliwej pozycji wzgledem bieżącego położenia pozycji
if(moz==0)
{
biezX=x;
biezY=y-1;
}
else if(moz==1)
{
biezX=x+1;
biezY=y;
}
if(moz==2)
{
biezX=x;
biezY=y+1;
}
if(moz==3)
{
biezX=x-1;
biezY=y;
}
//jeśli bieżąca pozycja wykracza poza labirynt to bierz następną
if((biezX<0 || biezX>maxX-1) || (biezY<0 || biezY>maxY-1))
{
moz++;
continue;
}
else
{
//jesli nie wykracza i jest drogą to nią idź
if(lab[biezY][biezX]=='2')
{
lab[biezY][biezX]='.';
szukajDrogi(biezX,biezY,str);
}
//jesli nie wykracza i jest jakimś wyjściem to znalałes wyjście
else if(lab[biezY][biezX]=='3')
{
cout<<"WYJSCIE !!!!"<<endl;
getch();
find=1;
return;
}
moz++;
}
}
}
labirynt::~labirynt()
{
if(!czyLabirynt)
return;
for(int i=0;i<maxY;i++)
delete [] lab[i];
delete [] lab;
}
11111111111111111111
22222222212222222221
12121111211211211121
12122222222222222221
12111211211121212121
12111211222222222221
12111222211212112121
12111211211211212121
12111222211212112121
12111111111111111111
12222222111111111111
11111112111111111111
11111112111111111111
11111112111111111111
11111112111111111111
11111112222111111111
11111111112222111111
11111111111112111111
11111111111112111111
11111111111113111111
Jeżeli chcesz wczytać plik zawierający więcej niż jedno słowo, musisz użyć funkcji getline:
getline(cin, lol);
Możesz też użyć zwykłej tablicy char:
const int MAX = 100;
char tab[MAX];
cin.getline(tab, MAX);
Użycie metody getline powoduje, że możesz wczytywać więcej niż jedno słowo (np. "moj plik.txt"). Drugi parametr to wielkość tablicy. Metoda wczyta maximum MAX - 1 znaków tak, by było zawsze miejsce na znak NULL (\0), który kończy każdy łańcuch znaków z C.
Poza tym, nie musisz określać w jakim celu chcesz otworzyć plik:
#include <fstream>
int main()
{
ifstream plik_in;
plik_in.open("sciezka_do_pliku.rozszerzenie");
ofstream plik_out;
plik_out.open("sciezka_do_pliku.rozszerzenie");
// cd.
}
P.S.
Już wiem, gdzie możesz mieć błąd:
deklarujesz plik jako zmienną typu fstream. Wydaje mi się, że powinieneś zadeklarować plik typu:
po zamianie na ifstream,getline(cin, lol); też jest tak samo wiem że mogę zdeklarować ścieżkę do pliku od razu ale che żeby użytkownik mógł ją sam wpisać
ps. jeśli ścieżka jest wcześniej zadeklarowana program działa normalnie
No to robisz tak:
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
cout << "Podaj sciezke pliku: ";
char sciezka[100];
cin.getline(sciezka, 100);
ifstream fin;
fin.open(sciezka);
ofstream fout;
fout.open(sciezka);
/* tutaj wykonujesz operacje na pliku */
fin.close();
fout.close();
return 0;
}
p.s.
może wpisujesz z palca inną ścieżkę?
Jaki komunikat Ci się pojawia?
po odpaleniu programu i wpisaniu ścieżki wyskakuje oknoz czymś takim:
Unhandled exception at 0x103159da (msvcr100d.dll) in labirynttttttt.exe: 0xC0000005: Access violation reading location 0xcdcdcdc1.
i program sie zawiesza:/ ścieżkę wpisuje dobrą bo kiedy wpisuje złą wyskakuje mi komunikat ze podałem złą;/
Podpowiem Ci co ja robię, żeby łatwiej wyłapać błędy:
Po pierwsze używam Edytora, który koloruje składnię i stosuje łatwe wcięcia: np. Notepad++ albo VisualStudio C++ 2010 Express Edition (oba darmowe z tym, że ten drugi tylko do niekomercyjnych projektów)
Po drugie, w funkcjach, oddzielam od siebie fragmenty kodu, które robią co innego, np.:
#include <iostream>
#include <string>
// przeprwa
int main()
{
using namespace std;
// przerwa
cout << "Witaj w programie!" << endl;
cout << "Podaj liczbe: ";
int liczba;
cin >> liczba;
// przerwa
cout << "Wprowadziles liczbe: " << liczba << endl;
// przerwa
return 0;
}
Po trzecie, jak mogłeś już zauważyć, stosuję spację pomiędzy każdym operatorem, czyli:
//TAK NIE PISZĘ:
#include <iostream>
#include <string>
int main()
{
using namespace std;
cout<<"Witaj w programie!"<<endl;
cout<<"Podaj liczbe:";
int liczba;
cin>>liczba;
cout<<"Wprowadziles liczbe: "<<liczba<<endl;
return 0;
}
Kod, który ładnie wygląda, łatwiej się czyta i znajduje w nim błędy.
Poza tym - staraj się, w miarę możliwości, pisać krótkie funkcje. Jeżeli jakaś funkcja będzie zbyt długa - łatwiej w niej o błąd oraz - trudniej znaleźć w niej pomyłkę. Lepiej jest napisać 5 funkcji, z których każda ma po 5 linii i potem wywoływać je z innej funkcji, niż napisać jedną z 15 linijkami. Im trudniejsze projekty, tym trudniej będzie się pisać długie funkcje i łatwiej o pomyłkę.
Pozdrawiam
MP