Gdzie zamknąć plik żeby program nie przestawał działać

0

tak jak w temacie gdzie mogło mi się to dziadostwo zapętlić że jak zamykam plik od razu wyskakuje mi okienko program przerwał działanie Przepraszam za moją składnię

 #include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cstdio>
#include <sstream>
using namespace std;

string chartostring(char *slowo){

	stringstream ss;
	string s;
	ss << slowo;
	ss >> s;
	return s ;
}

struct osoby{

	string imie;
	string nazwisko;
	char NrKarty[20];
	float zadluzenie;
	string oznaczenie;
};

osoby ludziska[100];

struct piniandz{

	string oznaczenie;
	string nazwa;
	float kde;//kurs do euro
	float kdd;//kurs do dolara
};

piniandz waluty[50];

string rozpoznanie(string &linijka ){

	if((int) linijka[1]<96)
		return "waluty";

		else return "osoby";
}
string* podzial(string wiersz){
    int x=0;
    int dlugosc=wiersz.length();
    string slowo;
    string *dane=new string[5];
    for(int i=0;i<dlugosc;i++){
        if(wiersz[i]!=' '){
            slowo+=wiersz[i];
        }

        else{
                *(dane+x)=slowo;
                slowo="";
                x++;
        }
        if(i==dlugosc-1){*(dane+x)=slowo;}
    }
    return dane;
    delete [] dane;}

string* podzial2(string wiersz){
    int x=0;
    int dlugosc=wiersz.length();
    string slowo;
    string *dane=new string[4];
    for(int i=0;i<dlugosc;i++){
        if(wiersz[i]!=' '){
            slowo+=wiersz[i];
        }

        else{
                *(dane+x)=slowo;
                slowo="";
                x++;
        }
        if(i==dlugosc-1){*(dane+x)=slowo;}
    }
    return dane;
    delete [] dane;
}

float konwersja(string napis){
    float y=(float)atof(napis.c_str());
    return y;
}

int main(int argc,char *argv[]) {
	//cout << argc << endl;
	if(argc==4){

		//cout<<argc<<endl;
		fstream plik;

		for(int i=1;i<argc;i++){
				plik.open(argv[i],ios::in);
cout<<plik.good()<<endl;
					if(plik.good()==true){

						while(!plik.eof()){

							string wiersz;
							getline(plik,wiersz);
							//cout<<rozpoznanie(wiersz)<<endl;

							if(rozpoznanie(wiersz)=="osoby"){

								int static raz=0;
								ludziska[raz].imie=*(podzial(wiersz));
								ludziska[raz].nazwisko=*(podzial(wiersz)+1);
								strcpy(ludziska[raz].NrKarty,(*(podzial(wiersz)+2)).c_str());
								ludziska[raz].zadluzenie=konwersja(*(podzial(wiersz)+3));
								ludziska[raz].oznaczenie=*(podzial(wiersz)+4);
								//ludziska[raz]={*(podzial(wiersz)),*(podzial(wiersz)+1),((*(podzial(wiersz)+2)).c_str()),konwersja(*(podzial(wiersz)+3)),*(podzial(wiersz)+4)};
								raz++;}

							if(rozpoznanie(wiersz)=="waluty"){

								int static x=0;
								waluty[x].oznaczenie=*(podzial2(wiersz));
								waluty[x].nazwa=*(podzial2(wiersz)+1);
								waluty[x].kde=konwersja(*(podzial2(wiersz)+2));
								waluty[x].kdd=konwersja(*(podzial2(wiersz)+3));
								x++;}
									}plik.close();	//

										  }


								}
		//cout<<ludziska[0].NrKarty<<endl;
		//cout<<ludziska[3].zadluzenie<<endl;
		//cout<<waluty[0].oznaczenie<<endl;
				}

	else{cout<<"Program nalezy uruchomic podajac trzy argumenty."<<endl;
		return EXIT_FAILURE;}
	}

z góry dziękuję za pomoc

0

Ten kod to jeden wielki WTF.

  1. chartostring -> wystarczy
string chartostring(char *slowo){
    return string(slowo);
}
  1. rozpoznanie -> co to za magiczna liczba 96? o_O
  2. podzial i podzial2 -> jeśli zwracasz wskaźnik do stringa to na 99% coś jest źle. W tym przypadku wszystko ;]
    Rozumiem że chciałeś dzielić stringa po spacjach? Zrób tak: http://stackoverflow.com/posts/5208977/revisions
    Dla jasności: po return żadna instrukcja się nie wykona, w tym przypadku twoje delete[] i zresztą dobrze bo przecież straciłbyś tą tablicę...
  3. Jak dla mnie akurat problemu z plikiem nie ma.
  4. Formatowanie kodu...
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cstdio>
#include <sstream>
using namespace std;

string chartostring(char *slowo) {

	stringstream ss;
	string s;
	ss << slowo;
	ss >> s;
	return s;
}

struct osoby {

	string imie;
	string nazwisko;
	char NrKarty[20];
	float zadluzenie;
	string oznaczenie;
};

osoby ludziska[100];

struct piniandz {

	string oznaczenie;
	string nazwa;
	float kde; //kurs do euro
	float kdd; //kurs do dolara
};

piniandz waluty[50];

string rozpoznanie(string &linijka) {

	if ((int) linijka[1] < 96)
		return "waluty";

	else
		return "osoby";
}
string* podzial(string wiersz) {
	int x = 0;
	int dlugosc = wiersz.length();
	string slowo;
	string *dane = new string[5];
	for (int i = 0; i < dlugosc; i++) {
		if (wiersz[i] != ' ') {
			slowo += wiersz[i];
		}

		else {
			*(dane + x) = slowo;
			slowo = "";
			x++;
		}
		if (i == dlugosc - 1) {
			*(dane + x) = slowo;
		}
	}
	return dane;
	delete[] dane;
}

string* podzial2(string wiersz) {
	int x = 0;
	int dlugosc = wiersz.length();
	string slowo;
	string *dane = new string[4];
	for (int i = 0; i < dlugosc; i++) {
		if (wiersz[i] != ' ') {
			slowo += wiersz[i];
		}

		else {
			*(dane + x) = slowo;
			slowo = "";
			x++;
		}
		if (i == dlugosc - 1) {
			*(dane + x) = slowo;
		}
	}
	return dane;
	delete[] dane;
}

float konwersja(string napis) {
	float y = (float) atof(napis.c_str());
	return y;
}

int main(int argc, char *argv[]) {
	if (argc == 4) {
		fstream plik;
		for (int i = 1; i < argc; i++) {
			plik.open(argv[i], ios::in);
			cout << plik.good() << endl;
			if (plik.good() == true) {
				while (!plik.eof()) {
					string wiersz;
					getline(plik, wiersz);

					if (rozpoznanie(wiersz) == "osoby") {

						int static raz = 0;
						ludziska[raz].imie = *(podzial(wiersz));
						ludziska[raz].nazwisko = *(podzial(wiersz) + 1);
						strcpy(ludziska[raz].NrKarty,
								(*(podzial(wiersz) + 2)).c_str());
						ludziska[raz].zadluzenie = konwersja(
								*(podzial(wiersz) + 3));
						ludziska[raz].oznaczenie = *(podzial(wiersz) + 4);
						raz++;
					}

					if (rozpoznanie(wiersz) == "waluty") {

						int static x = 0;
						waluty[x].oznaczenie = *(podzial2(wiersz));
						waluty[x].nazwa = *(podzial2(wiersz) + 1);
						waluty[x].kde = konwersja(*(podzial2(wiersz) + 2));
						waluty[x].kdd = konwersja(*(podzial2(wiersz) + 3));
						x++;
					}
				}
				plik.close();        //

			}
		}
	}
	else {
		cout << "Program nalezy uruchomic podajac trzy argumenty." << endl;
		return EXIT_FAILURE;
	}
}
0

ta funkcja ma za zadanie rozpoznać czy linijka która zostaje pobrana jest linijką która zawiera dane odnośnie walut bądź kredytobiorców.

używam eclipse i ciągle wyskakuje mi błąd odnośnie pliku podaje zawartość plików

 Waldemar Wizowy 4024007198495169 10 PLN
Andrzej Ekspresowy 346745036946212 10 USD
Podstawowy Dobry 0123456785012345677 1 USD
Podstawowy Zly 0123456785012345676 1 USD

2 plik

PLN zloty polski 0.23059 0.30299
USD dolar amerykanski 0.7564689031 1 

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