• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

program z przeszukiwaniem pliku i znajdowaniem danych; zawiesza się

0 głosów
463 wizyt
pytanie zadane 5 stycznia 2017 w C i C++ przez karola Nowicjusz (230 p.)
edycja 6 stycznia 2017 przez karola

Zadanie brzmi: W pliku BazaAut.txt zawarte są dane samochodów w następujący sposób: w grupach po 5 linii każda są:
marka
model
przebieg
pojemność
rok produkcji
Napisz program, który zapisze do pliku Zabytki.txt dane tylko tych samochodów, które mają co najmniej 25 lat. Dane w pliku Zabytki.txt mają być zapisane w ten sam sposób jak w pliku BazaAut.txt.

Program ma być napisany w C++, zaczęłam kombinować, ale kompletnie nie wiem teraz już co do czego dołączyć w tym moim "programie"... na pewno nie działa funkcja która miała sprawdzać czy auto ma co najmniej te 25 lat, w main pojawia się problem, gdy chciałam stworzyć tablicę na zestawy danych... a przede wszystkim nawet nie wiem czy to co już zdołałam wymyślić ma jakikolwiek sens. Proszę o pomoc.

 

#include<iostream>
#include<fstream>
#include<string.h>

using namespace std;

class samochod
{
public:
    string marka;
    string model;
    string przebieg;
    string pojemnosc;
    string rok;

    int nr_linii;
    int nr_auta;
    
    

    void czytaj_plik();
    void szukaj_zabytku();
    int liczba_aut();

};

void samochod:: czytaj_plik()
{
    fstream plik;
   plik.open("BazaAut.txt",ios::in);

   if(plik.good()==false)
   {
      cout<<"Nie udalo sie otworzyc pliku!";
      exit(0);
   }

   int nr_linii=(nr_auta-1)*5+5;  // tu bedzie nam czytac linie z rokiem pr.
   int aktualny_nr=1;
   string linia; // bedzie czytac rok produkcji

   while(getline(plik,linia))
   {
      if(aktualny_nr==nr_linii) rok=linia;
      if(aktualny_nr==nr_linii+1) marka=linia;
      if(aktualny_nr==nr_linii+2) model=linia;
      if(aktualny_nr==nr_linii+3) przebieg=linia;
      if(aktualny_nr==nr_linii+4) pojemnosc=linia;
      aktualny_nr++;
   }

   plik.close();
}

void samochod::szukaj_zabytku() //!!!!!!!!!!!!!!!!!!
{
    if(rok<=1992)     //ta funkcja jest zla bo rok nie jest int tylko string :( 
        cout<<marka<<endl<<model<<endl<<przebieg<<endl<<pojemnosc<<endl<<rok<<endl;
}

int samochod::liczba_aut() //PROBLEM
{
	fstream plik;
   plik.open("BazaAut.txt",ios::in);

   if(plik.good()==false)
   {
      cout<<"Nie udalo sie otworzyc pliku!";
      exit(0);
   }

   int nr_linii=(nr_auta-1)*5+1;  // tu bedzie nam czytac linie z przebiegiem
   int aktualny_nr=1;
   string linia; // bedzie czytac rok produkcji

   while(getline(plik,linia))
   {
      if(aktualny_nr==nr_linii) marka=linia;
      if(aktualny_nr==nr_linii+1) model=linia;
      if(aktualny_nr==nr_linii+2) przebieg=linia;
      if(aktualny_nr==nr_linii+3) pojemnosc=linia;
      if(aktualny_nr==nr_linii+4) rok=linia;
      aktualny_nr++;
      
   } 


   plik.close();
  
   return aktualny_nr;
}

int main()
{ fstream plik2;
  plik2.open("Zabytki.txt", ios::out);

  if(plik2.good()==false)
   {
      cout<<"Nie udalo sie otworzyc pliku!";
      exit(0);
   }
   else
   //PROBLEM
   { 
   samochod a[];
   while(linia!=NULL)
   {int i=1;
   i++
   
    a[i].czytaj_plik();
    a[i].szukaj_zabytku();
   }
   }
}


 

komentarz 6 stycznia 2017 przez karola Nowicjusz (230 p.)

Trochę zmieniając powyższy kod, udało się skompilować (wykomentowałam zapis do pliku póki co bo tu wyskakiwał mi błąd i chciałam chociaż wyświetlić na ekran), jednak program tak jakby się zawiesił, nic się z nim nie dzieje dłuuuugi czas.

Czy jakaś dobra dusza pomoże? :)

#include<iostream>
#include<fstream>
#include<string.h>

using namespace std;

class samochod
{
public:
    string marka;
    string model;
    string przebieg;
    string pojemnosc;
    int rok;

	int nr_auta;
	
	void czytaj_plik();
	void sprawdz_wiek();

};


void samochod:: czytaj_plik()
{
    fstream plik;
   plik.open("BazaAut.txt",ios::in);

   if(plik.good()==false)
   {
      cout<<"Nie udalo sie otworzyc pliku!";
      exit(0);
   }

   int nr_linii=(nr_auta-1)*5+5;  // tu bedzie nam czytac linie z rokiem produkcji
   int aktualny_nr=1;
   string linia; // bedzie czytac rok produkcji

   while(!plik.eof())
   {
      if(aktualny_nr!=nr_linii)  aktualny_nr++;
   }

   plik.close();
}

void samochod::sprawdz_wiek()
{	fstream plik;
   plik.open("BazaAut.txt",ios::in);

   if(plik.good()==false)
   {
      cout<<"Nie udalo sie otworzyc pliku!";
      exit(0);
   }

   int nr_linii=(nr_auta-1)*5+5;  // tu bedzie nam czytac linie z rokiem produkcji
   int aktualny_nr=1;
   string linia; // bedzie czytac rok produkcji

   while(!plik.eof())
   {
      if(aktualny_nr!=nr_linii) 
	  {
	  cin>>rok; aktualny_nr++;}
   }

   plik.close();
	
	if(rok<=1992)
	 cout<<marka<<endl<<model<<endl<<przebieg<<endl<<pojemnosc<<endl<<rok<<endl;
	
}

int main()
{
	samochod s;
/*	fstream plik2;
  	plik2.open("Zabytki.txt", ios::out);

  if(plik2.good()==false)
   {
      cout<<"Nie udalo sie otworzyc pliku!";
      exit(0);
   }
   else
{
   
*/
fstream plik;
plik.open("BazaAut.txt", ios::in);
if(plik.good()==false)
{
	cout<<"blad";
	exit(0);
}
while(!plik.eof())
{
	s.nr_auta;
	s.czytaj_plik();
	s.sprawdz_wiek();
	

plik.close();

//plik2.close();
}}

 

1 odpowiedź

0 głosów
odpowiedź 5 stycznia 2017 przez Szykem2 Nałogowiec (29,510 p.)

Jeżeli chodzi tylko o konwersje string->int możesz użyć std::stoi(std::string) LINK albo atoi(const char*) LINK.

komentarz 6 stycznia 2017 przez karola Nowicjusz (230 p.)
nie chodzi tylko o to, ale może się przyda :) dziękuje

Podobne pytania

0 głosów
4 odpowiedzi 844 wizyt
0 głosów
0 odpowiedzi 480 wizyt
0 głosów
2 odpowiedzi 444 wizyt
pytanie zadane 1 września 2017 w C i C++ przez wojtekd09 Początkujący (260 p.)

93,740 zapytań

142,675 odpowiedzi

323,294 komentarzy

63,319 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...