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

Odczyt w pliku C++

Object Storage Arubacloud
+1 głos
280 wizyt
pytanie zadane 4 lutego 2021 w C i C++ przez Krzysiek Kołodziej Nowicjusz (160 p.)
edycja 4 lutego 2021 przez Krzysiek Kołodziej

Cześć, mam do wykonania następujące zadanie:

Zapisz do kolejnych linii pliku ksiazkiXY.txt tytuły oraz ceny 5 książek. Ceny powinny być w przedziale <10;30> Odczytaj dane z pliku oraz zapisz do pliku tanie_ksiazkiXY.txt tylko te tytuły oraz ich ceny dla których cena książki jest niższa niż 20.50.

Napisałem program, jednak co zrobić aby działała pętla sprawdzająca, czy cena jest mniejsza od 20.50. Byłbym bardzo wdzięczny za pomoc.

#include<iostream>
#include<cstdlib>
#include<fstream>
#include<time.h>
#include<stdio.h>
#include<windows.h>

using namespace std;

int cena[5];
string nazwa[5];

int zapis()
{
	srand(time(NULL));
	fstream plik;
	
	plik.open("ksiazkiKK.txt",ios::out);
	
	nazwa[0] = "'Dżuma'";
	nazwa[1] = "'Kamienie na Szaniec'";
	nazwa[2] = "'Piraci z Karaibów'";
	nazwa[3] = "'Potop'";
	nazwa[4] = "'O takim jednym'";
	
	for (int i=0; i<5; i++) 
	{	
	cena[i]=rand()%21+10;
	
	plik<<"Ksiazka "<<nazwa[i]<<" Cena: "<<cena[i]<<"pln"<<" "<<endl;

	}		
	plik.close();
}

int main()
{	
	zapis();

	fstream plik2,odczyt;

	plik2<<"Lista tanich książek!"<<endl;
	
	plik2.open("tanie_ksiazkiKK.txt",ios::out);
	odczyt.open("ksiazkiKK.txt",ios::in);
		
	string linia;
	for (int i=0; i<5; i++) 
	{	
	
	while(!odczyt.eof())
	{
		getline(odczyt,linia);
        cena[i]=atoi(linia.c_str());
		cout<<linia<<endl;			
		if(cena[i]<20.50)
		{
			plik2<<linia<<endl;
		}
		i++;
	}	
	}
	odczyt.close();
	plik2.close();	
}

 

komentarz 4 lutego 2021 przez GeFeC Nowicjusz (100 p.)

Próbujesz zamienić na liczbę całą linię tekstu, np. "Ksiazka 'Dżuma' Cena: 13pln". W zadaniu jest tylko wspomniane by do pliku zapisać tytuły i ceny książek, więc równie dobrze można to zrobić tak: "'Dżuma' 13". W takiej formie łatwiej odczytać cenę, można np. zamienić getline'a na: "odczyt >> tytul >> cenaStr;" gdyby cena ZAWSZE była drugim wyrazem w danej linijce pliku. Niestety niektóre tytuły mają w sobie więcej niż jedno słowo, dlatego ten sposób też nie zadziała. Wydaje się, że jedynym sposobem będzie napisać skrypt, który wykryje gdzie kończy się tytuł (np. taki który znajduje drugi średnik w linijce) i do zmiennej wpisać to, co jest dalej.

 

PS: Jeśli chcesz sprawdzić czy liczba jest mniejsza niż 20.50 to użyj funkcji atof(), a nie atoi(), gdyż ta druga konwertuje na typ int

komentarz 4 lutego 2021 przez j23 Mędrzec (194,920 p.)

Format pliku jest kiepski w parsowaniu. Lepiej zrobić: <tytuł>; <cena> i wtedy można odczyt zrobić tak:

std::string tytul;
double cena;

while(std::getline(odczyt >> std::ws, tytul, ';') >> cena) {
    // tu sprawdzasz cenę i wypisujesz, jeśli trzeba    
}

Żadnych tablic nie trzeba...

1 odpowiedź

+1 głos
odpowiedź 7 lutego 2021 przez VBService Ekspert (253,300 p.)
wybrane 9 lutego 2021 przez Krzysiek Kołodziej
 
Najlepsza

Propozycja w oparciu o "wskazówkę" od @j23

#include <iostream>
#include <fstream>
#include <time.h>
#include <iomanip>

using namespace std;

int main()
{
    srand(time(NULL));

    string nazwa[5];
    
    fstream plik, plik_tanie;
    plik.open("ksiazkiKK.txt", ios::out); // Zapisz do kolejnych linii pliku ksiazkiXY.txt
    
    nazwa[0] = "Dżuma";
    nazwa[1] = "Kamienie na Szaniec";
    nazwa[2] = "Piraci z Karaibów";
    nazwa[3] = "Potop";
    nazwa[4] = "O takim jednym";
    
    for (int i=0; i<5; ++i)
    {
        // tytuły oraz ceny 5 książek.
        // Ceny powinny być w przedziale <10;30>
        plik << nazwa[i] << "; "
             << setprecision(4) << 10 + (double)(rand()) / ((double)(RAND_MAX / (30 - 10)))
             << endl;        
    }
    
    plik.close();
    
    string tytul;
    double cena;
    
    plik.open("ksiazkiKK.txt", ios::in); // Odczytaj dane z pliku
    plik_tanie.open("tanie_ksiazkiKK.txt", ios::out); // oraz zapisz do pliku tanie_ksiazkiXY.txt
    while (getline(plik >> ws, tytul, ';') >> cena)
    {
        cout << "Ksiazka: " << tytul << "\nCena: " << cena << "pln" << endl;
        
        // tylko te tytuły oraz ich ceny dla których
        // cena książki jest niższa niż 20.50.
        if (cena < 20.5)
            plik_tanie << tytul << "; " << cena << endl;
    }
    
    plik_tanie.close();
    plik.close();
    
    return 0;
}

Przykładowe dane "wyjściowe" (przy każdym uruchomieniu generowane pseudo-losowo)

ksiazkiKK.txt

Dżuma; 24.87
Kamienie na Szaniec; 16.98
Piraci z Karaibów; 25.1
Potop; 17.86
O takim jednym; 13.52

tanie_ksiazkiKK.txt

Kamienie na Szaniec; 16.98
Potop; 17.86
O takim jednym; 13.52

Generate Random Double in C++ ]

Podobne pytania

0 głosów
1 odpowiedź 299 wizyt
pytanie zadane 1 września 2022 w C i C++ przez polandonion Mądrala (7,040 p.)
0 głosów
0 odpowiedzi 760 wizyt
pytanie zadane 28 maja 2019 w Egzaminy zawodowe przez maszka Nowicjusz (140 p.)
0 głosów
1 odpowiedź 1,267 wizyt
pytanie zadane 30 marca 2018 w SQL, bazy danych przez betman Bywalec (2,630 p.)

92,568 zapytań

141,420 odpowiedzi

319,623 komentarzy

61,956 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...