Pereiti prie turinio

C++ Programa luzta (neuzdaro failo)


Rekomenduojami pranešimai

Sveiki, bandau nusiskaityti duomenis is tokio tekstinio failo

Sokoladas 4 6

Ledai 3 4

Sultys 1 3

Duona 2 4

Bet programa uzluzta. Debuginau ir kazkodel neuzdaro failo fd1.close(). Kas gali buti blogai?

Uzluzus ismeta:

Unhandled exception at 0x00339006 in Rim.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.

 

// Prekes
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

using namespace std;

const char CD[] = "Duomenys.txt";
const char CD1[] = "Pirkejas";
const char FR[] = "Rezultatai.txt";
const char CMax = 100;

class Pirkejas{
private:
string prekespavadinimas; // prekes pavadinimas
int pagkiek; // pageidautinas prekiu kiekis jei prekei nuolaidos nera
int nuopagkiek; // didziausias pageidautinas prekes kiekis jei nuolaida yra
public:
// Konstruktorius (jis butinas!)
Pirkejas():prekespavadinimas(""), pagkiek(0), nuopagkiek(0)
{}
Pirkejas(string prekespavadinimas, int pagkiek, int nuopagkiek):
	prekespavadinimas(prekespavadinimas), pagkiek(pagkiek), nuopagkiek(nuopagkiek)
{}
//
void DetiPrekes(string prekespavadinimas, int pagkiek, int nuopagkiek);
string ImtiPrekesPavadinimas(){return prekespavadinimas;}
int ImtiPagKiek(){return pagkiek;}
int ImtiNuoPagKiek(){return nuopagkiek;}
};
void Pirkejas::DetiPrekes(string prekespavadinimas, int pagkiek, int nuopagkiek){
 Pirkejas::prekespavadinimas=prekespavadinimas;
 Pirkejas::pagkiek=pagkiek;
 Pirkejas::nuopagkiek=nuopagkiek;
}

void SkaitytiDuomenis(const char CD[], Preke p[], int & s);
void SpausdintiDuomenis(const char FR[], Preke p[], int s);
void SkaitytiPirkejus(const char CD1[], Pirkejas pp[], int & n);

int main(){
cout << "Programa veikia" << endl;
setlocale(LC_ALL, "Lithuanian");

int n; 

Pirkejas pp[CMax];

SkaitytiPirkejus(CD1, pp, n);

system ("pause");
return 0;
}
void SkaitytiPirkejus(const char CD1[], Pirkejas pp[], int & n){
string prekespavadinimas;
int pagkiek, nuopagkiek;
ifstream fd1(CD1);
n=0;
while(!fd1.eof()){
	fd1 >> prekespavadinimas >> pagkiek >> nuopagkiek;
	pp[n].DetiPrekes(prekespavadinimas, pagkiek, nuopagkiek);
	//cout << pp[n].ImtiPrekesPavadinimas() << " " << pp[n].ImtiPagKiek() << "  " << pp[n].ImtiPagKiek() << endl;
n++;
}
fd1.close(); // kazkodel programa neuzdaro failo.
}

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Po n++ pabandyk įdėti: fd1.ignore();

Gaila, nepadejo.

 

Man truputeli kliuva sitas tesktas

Unhandled exception at 0x00339006 in Rim.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.

cia raso kad kazkas su tekstiniu failu vieta blogai. Tai dabar perkopinau visus failus i visus folderius bet nieks nepasikeicia.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Gaila, nepadejo.

 

Man truputeli kliuva sitas tesktas

 

cia raso kad kazkas su tekstiniu failu vieta blogai. Tai dabar perkopinau visus failus i visus folderius bet nieks nepasikeicia.

Galbūt pats failas tiesiog tinkamai atsidaro (bet tada galbūt neskaitytų netgi nieko?), ar kintamasis yra null, ar pan. Kiek per keistas erroras, nors nežinau, ar C++ standartinė biblioteka gražiai mėto exceptionus, bet šitas panašus į visai gryną tokį blogą atminties naudojimą (segfault ir pan.) :)

 

Esi tikras, kad neperlipi, pvz., masyvo rėžių? Išsivedinėk n cikle – matysi, kiek dedi. :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Galbūt pats failas tiesiog tinkamai atsidaro (bet tada galbūt neskaitytų netgi nieko?), ar kintamasis yra null, ar pan. Kiek per keistas erroras, nors nežinau, ar C++ standartinė biblioteka gražiai mėto exceptionus, bet šitas panašus į visai gryną tokį blogą atminties naudojimą (segfault ir pan.) :)

 

Esi tikras, kad neperlipi, pvz., masyvo rėžių? Išsivedinėk n cikle – matysi, kiek dedi. :)

Tarikem, kad perlipu per masyvo rezius. Ka tokiu atveju daryti? kurtis dar viena kontstanta char CMax1 ? Jei taip, jau bandyta ir nieks nepadejo.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jauti skirtuma tarp "Failo pavadinimas" ir "Failo pavadinimas.txt". Normaliai failo varda apsirasai ir viskas veikia.

Dekui, kaip nekenciu tokiu klaidu. Kazkaip kiek keiciau failu vardu tiek nepridejau txt galunes. Aciu dar karta.

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tarikem, kad perlipu per masyvo rezius. Ka tokiu atveju daryti? kurtis dar viena kontstanta char CMax1 ? Jei taip, jau bandyta ir nieks nepadejo.

Nors ir nebuvo šitas dalykas, bet NEPERLIPTI. Kame bėda, nemokėtum ciklo sustabdyti? CMax jei yra tavo absoliutus maximumas, tai normaliomis sąlygomis ir nebus tokių atvejų, kad perliptum.

 

O jei visgi lipi, tai kažkur pralipa sąlygą (kaip n < CMax – galbūt blogos reikšmės ar blogai aprašyta?), o kai tokios nėra, tai kitą salygą (kaip eof() – blogai skaitoma, niekada nesibaigia failas?). Ta prasme, niekas neatsitinka šiaip sau. Šalint reik problemą, o ne pasėkmes.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...