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

Zapis | Odczyt.

VPS Starter Arubacloud
0 głosów
384 wizyt
pytanie zadane 4 czerwca 2015 w C i C++ przez Mleczko Początkujący (260 p.)

Witam!

 

Problem polega na tym, iż zrobiłem 2 małe programy, kalkulator, który zapisuje dane użytkownika wprowadzone na początku oraz program, który te dane odczytuje, jednak odczytuje on tylko dane wprowadzone po raz pierwszy, reszta tkwi w notatniku ale program ich nie uwzględnia.

 

kody źródłowe 

1.Kalkulator

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <conio.h>
#include <fstream>
using namespace std;
float x,y;
char wybor;
string imie, nazwisko;
string klasa;

int main()
{
    cout <<"Podaj swoje imie: ";
                                        cin >>imie;
    cout << "Podaj swoje nazwisko: ";
                                        cin >>nazwisko;
    cout << "Podaj swoja klase: ";
                                        cin>>klasa;

   fstream plik;

    plik.open("dane.txt", ios::out | ios::app);
    plik<<imie<<endl;
    plik<<nazwisko<<endl;
    plik<<klasa<<endl;


    plik.close();

    cout<< endl;
for (;;)
{


    cout << "Podaj pierwsza liczbe: ";
    cin >> x;
    cout << " Podaj druga liczbe: ";
    cin >> y;




    cout << endl;
    cout << "MENU GLOWNE" <<endl;
    cout<< "---------------"<<endl;
    cout <<"1. Dodawanie"<<endl;
    cout <<"2. Odejmowanie" <<endl;
    cout <<"3. Mnozenie" <<endl;
    cout <<"4. Dzielenie" <<endl;
    cout <<"5. Zamknij" <<endl;


    cout <<" Wybierz: " ;
    wybor = getch();

    switch(wybor)
    {
    case '1':

            cout<<"Suma = " <<x+y;

        break;

    case '2':

        cout<<"Roznica = "<<x-y;

        break;

    case '3':
        cout<<"Iloczyn = "<<x*y;

        break;

    case '4':
        if (y==0) cout <<"Nie dzielimy przez zero!";
        else cout <<"Iloraz = "<<x/y;

        break;

    case '5':
        system("pause");
        exit (0);
        break;

        default: cout<<" Taka opcja nie istnieje w menu!";

    }
getchar();getchar();
system("cls");
}
system("pause");
    return 0;
}

2. Odczyt

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

int main()

{
    string imie,nazwisko,klasa;
fstream plik;
plik.open("dane.txt", ios::in);
if(plik.good()==false)
{
    cout<<"Plik nie istnieje!";
     system("pause");
    exit(0);
}
string linia;
int nrlinii=1;
while(getline(plik, linia))
{
    switch(nrlinii)
    {
        case 1: imie = linia; break;
        case 2: nazwisko = linia;break;
        case 3: klasa = linia; break;
    }



nrlinii++;
}
plik.close();


   cout<<imie<<endl;
    cout<<nazwisko<<endl;
    cout<<klasa<<endl;




 system("pause");
    return 0;

}

 

2 odpowiedzi

0 głosów
odpowiedź 4 czerwca 2015 przez draghan VIP (106,230 p.)

Hmmm... Chyba chodzi o to, że Twój program zapisujący zawsze dopisuje na końcu pliku dane, a nie nadpisuje dotychczasowej zawartości.

// zamień:
plik.open("dane.txt", ios::out | ios::app); 
// na
plik.open("dane.txt", ios::out); 

i daj znać, czy o to Ci chodziło. :)

komentarz 4 czerwca 2015 przez draghan VIP (106,230 p.)

Okej, to daj zamiast lenght() size()

komentarz 4 czerwca 2015 przez Mleczko Początkujący (260 p.)
Działa, dziękuje za pomoc :) Miłego popołudnia :)
komentarz 4 czerwca 2015 przez draghan VIP (106,230 p.)
A rozumiesz ten kod? :)
komentarz 4 czerwca 2015 przez Mleczko Początkujący (260 p.)
W mniejszym lub większym stopniu tak, dużo pomogła mi w zrozumieniu Twoja wcześniejsza wypowiedź :). Jeszcze pewnie sobie go przeanalizuje na spokojnie trochę później.
komentarz 10 czerwca 2015 przez Mleczko Początkujący (260 p.)
edycja 10 czerwca 2015 przez Mleczko
Jeżeli możesz to wytłumaczysz mi dokładne znaczenie tego kodu ?

 

EDIT: pytam bo mam chwilę czasu ;)
0 głosów
odpowiedź 4 czerwca 2015 przez criss Mędrzec (172,590 p.)
No a jak ma odczytywać? Masz w zapisie ios::app, więc program dopisuje do pliku. Tak więc imie zapisane po raz 2., będzie w 4. linii.

Ja bym zrobił to tak:

Pirwszą linie pliku przeznacz na liczbe "dopisywań" ( po prostu za każdym razem, gdy zapisujesz, pobieraj ją z pliku, zwiększaj o 1 i zapisz ponownie. I w petli zrób odczyt. Tzn. jak masz ten case, to zamiast 1,2,3 - daj liczba_dopisywan * nr. Mozesz tez dac uzytkownikowi do wyboru, ktory zapis chce odczytac - czyli dajesz mu mozliwosc wyboru tego mnoznika nr linii.
komentarz 4 czerwca 2015 przez Mleczko Początkujący (260 p.)
Tak szczerze to dopiero uczę się C++ (myślę, że widać po kodzie jak i po pytaniu) i nie za bardzo wiem jak to zrobić, tzn. wiem o co chodzi jednak dużo się mi miesza w tym momencie ...
komentarz 4 czerwca 2015 przez criss Mędrzec (172,590 p.)
Rozumiem, tez z czasem co raz latwiej wszystko ogarniam :D No ale, widze, ze juz znalazles dzialajace rozwiazanie, wiec zostawiam temat

Podobne pytania

0 głosów
2 odpowiedzi 1,460 wizyt
pytanie zadane 1 stycznia 2019 w C i C++ przez nooblike Nowicjusz (120 p.)
0 głosów
1 odpowiedź 620 wizyt
pytanie zadane 7 grudnia 2018 w C i C++ przez matiibal Użytkownik (620 p.)
0 głosów
1 odpowiedź 317 wizyt
pytanie zadane 3 listopada 2018 w C i C++ przez gorgonkowa Obywatel (1,810 p.)

93,022 zapytań

141,986 odpowiedzi

321,288 komentarzy

62,367 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...