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

Problem z zapisem do pliku tekstowego

Object Storage Arubacloud
0 głosów
190 wizyt
pytanie zadane 8 grudnia 2015 w C i C++ przez Jonki Dyskutant (8,180 p.)
edycja 8 grudnia 2015 przez Jonki
Operacja kończy sie pomyślnie, bo wyskakuje komunikat, że konto zostało utworzone, ale w pliku nie dodaje żadnego konto i nie wiem o co chodzi. 
A pobieram te dane do tabeli, bo zaraz chcę dopisać porównywanie czy dany PIN istnieje już w bazie danych.

#include <iostream>
#include <fstream>
#include <windows.h>
#include "naglowki.h"

using namespace std;

void Bankomat::proces_rejestracji(int PIN)
{
    fstream plik;

    plik.open("klienci.txt", ios::out | ios::app);
    if(plik.good() == false)
    {
        system("cls");

        cout << "Blad polaczenia z baza danych!";
        Sleep(2000);
    }
    else
    {
        wczytaj_ilosc_klientow();

        string linia;
        int nr_linii = 1;
        int licznik = 0, licznik2 = 0;

        int *PINy = new int[ilosc_klientow];
        int *Stany_kont = new int[ilosc_klientow];

        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
            case 1:
                {
                    PINy[licznik] = atoi(linia.c_str());
                    licznik++;
                    break;
                }
                case 2:
                {
                    Stany_kont[licznik2] = atoi(linia.c_str());
                    licznik2++;
                    break;
                }
            }

            if(nr_linii == 2)
            {
                nr_linii = 0;
            }
            nr_linii++;
        }

        plik << PIN << endl;
        int Stan_konta = 0;
        plik << Stan_konta << endl;

        cout << "Konto zostalo utworzone. Dziekujemy!";
        Sleep(2000);

        plik.close();
        plik.clear();

        delete[] PINy;
        delete[] Stany_kont;
    }
}

 

2 odpowiedzi

0 głosów
odpowiedź 8 grudnia 2015 przez niezalogowany
Przed zapisem dodaj: plik.clear(); plik.seekp(0,ios::end);
komentarz 8 grudnia 2015 przez Jonki Dyskutant (8,180 p.)

Działa, dzięki. Możesz mi napisać do czego służy seekp?

komentarz 8 grudnia 2015 przez niezalogowany
Ustawia pozycje wskaźnika zapisywania danych do pliku. Pierwszy argument to pozycja a drugi to względem czego jest ustawiana pozycja(w tym przypadku względem końca pliku)
0 głosów
odpowiedź 8 grudnia 2015 przez Jonki Dyskutant (8,180 p.)

A pomoże ktoś rozwiązać jeszcze jeden problem? Chodzi o dziwne dane, które są w tablicy, a powinny być takie jakie są w pliku tekstowym. Dla przykładu chcę wyświetlić PINy[0] a tam liczba 2674680 zamiast 1234.

 

#include <iostream>
#include <fstream>
#include <windows.h>
#include "naglowki.h"

using namespace std;

void Bankomat::proces_rejestracji(int PIN)
{
    fstream plik;

    plik.open("klienci.txt", ios::out | ios::app);
    if(plik.good() == false)
    {
        system("cls");

        cout << "Blad polaczenia z baza danych!";
        Sleep(2000);
    }
    else
    {
        wczytaj_ilosc_klientow();

        string linia;
        int nr_linii = 1;
        int licznik = 0;

        int *PINy = new int[ilosc_klientow];

        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
            case 1:
                {
                    PINy[licznik] = atoi(linia.c_str());
                    licznik++;
                    break;
                }
            }

            if(nr_linii == 2)
            {
                nr_linii = 0;
            }
            nr_linii++;
        }

        int licznik_klientow = 0;

        for(int i = 0; i < ilosc_klientow; i++)
        {
            if(PIN == PINy[i])
            {
                cout << endl << endl;

                cout << "PIN jest juz zarejestrowany. Podaj inny...";
                Sleep(2000);
            }
            else if(PIN != PINy[i])
            {
                licznik_klientow++;
            }
        }

        cout << PINy[0];
        system("pause");

        if(licznik_klientow == ilosc_klientow)
        {
            plik.clear();
            plik.seekp(0,ios::end);

            plik << PIN << endl;
            int Stan_konta = 0;
            plik << Stan_konta << endl;

            cout << "Konto zostalo utworzone. Dziekujemy!";
            ilosc_klientow++;
            Sleep(2000);

            zapisz_ilosc_klientow();
        }

        plik.close();
        plik.clear();

        delete[] PINy;
    }
}

plik tekstowy 

1234
0
1234
0
1234
0
1234
0
9999
0
5656
0
1212
0
1123
0
komentarz 8 grudnia 2015 przez niezalogowany
Jako że wszystko jest liczbą to nie wczytuj getlinem tylko użyj operatora>> czyli plik>>PINy[licznik]
komentarz 8 grudnia 2015 przez Jonki Dyskutant (8,180 p.)

O to chodzi?

while(!plik.eof())
        {
            switch(nr_linii)
            {
            case 1:
                {
                    plik >> PINy[licznik];
                    licznik++;
                    break;
                }
            }

            if(nr_linii == 2)
            {
                nr_linii = 0;
            }
            nr_linii++;
        }

Ale dalej pokazuje inne liczby.

komentarz 8 grudnia 2015 przez niezalogowany
Przywróc starą wersję kodu i dodaj ios::in w konstruktorze plik. Jeśli nie zadziała to jutro zerkne jeszcze na kod i pomyśle.
komentarz 8 grudnia 2015 przez Jonki Dyskutant (8,180 p.)

Napiszę Ci co jest nie tak.

 

Jeśli użytkownik chce się zarejestrować PINem, którego nie ma w bazie, to normalnie się dopisuje jego PIN i stan konta do notatnika i wzrasta liczba w pliku z ilością klientów, natomiast jeśli klient chce się zarejestrować PINem, który już jest w bazie to też normalnie się rejestruje, tylko, że już nie wzrasta liczba klientów w pliku tekstowym.
 

komentarz 8 grudnia 2015 przez Jonki Dyskutant (8,180 p.)
No ja nie mogę. Masakra jakaś. Dwie godziny życia zmarnowane przez to, że zamiast 'in' miałem 'out'. Już wszystko śmiga. Wielkie dzięki.
komentarz 8 grudnia 2015 przez niezalogowany
Cieszę się że pomogłem ;)

Podobne pytania

0 głosów
3 odpowiedzi 173 wizyt
0 głosów
3 odpowiedzi 194 wizyt
pytanie zadane 18 grudnia 2015 w C i C++ przez kuka323 Nowicjusz (200 p.)
0 głosów
4 odpowiedzi 379 wizyt
pytanie zadane 28 maja 2015 w C i C++ przez Wiktor Stary wyjadacz (11,120 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...