otwieranie pliku

0

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

0

pobiore ją

Z internetu, od użytkownika, czy jak?
Rozwiń swoją myśl.

0

http://www.cplusplus.com/reference/string/string/c_str/

plik.open(lol.c_str(),ios::in)

Pewnie o to chodzi.

0

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

0

Daj cały kod, jeśli moje nie działa.

0

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

0

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

0

dalej nie moge sobie poradzić;/ cały kod może ktoś mi wytłumaczy co źle robie?

main

#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;
}

plik nagłówkowy

#include <string>
struct labirynt
{

    int pozX, pozY, maxX, maxY;
    char **lab;
    bool czyLabirynt;
 
   labirynt();
    void pokazLabirynt();  
    bool wskazStart();  
    void szukajDrogi(int,int,int);
    ~labirynt();            

};

wszystkie funkcje

#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;
}

plik txt

11111111111111111111
22222222212222222221
12121111211211211121
12122222222222222221
12111211211121212121
12111211222222222221
12111222211212112121
12111211211211212121
12111222211212112121
12111111111111111111
12222222111111111111
11111112111111111111
11111112111111111111
11111112111111111111
11111112111111111111
11111112222111111111
11111111112222111111
11111111111112111111
11111111111112111111
11111111111113111111

0

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:

  • ifstream - gdy chcesz z niego czytać
  • ofstream - gdy chcesz do niego pisać
0

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

0

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?

0

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łą;/

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1