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

Wyświetlenie danych z pliku tekstowego na wskaźnikach

Object Storage Arubacloud
0 głosów
267 wizyt
pytanie zadane 16 czerwca 2022 w C i C++ przez Noizz00 Użytkownik (910 p.)

Witam,

podjąłem się zadania znacznego rozbudowania jednego z programów z kursu p. Zelenta (odcinek o plikach tekstowych). Otóż, użytkownik ma do wyboru parę opcji, jedną z nich (oznaczoną znakiem '4') jest odczytanie danych z istniejącego pliku (w którym są zestawy danych w postaci:

imie

nazwisko

numer telefonu).

Zadeklarowane biblioteki i zmienne:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <conio.h>
#include <cstring>

using namespace std;

int ile;
char wybor;
fstream plik;
string *imie, *nazwisko;
int *nr_tel;

A tutaj fragment switcha z casem nr 4:

case '4':  // Wykonaj, jesli uzytkownik chce odczytac dane z pliku
        {
            plik.open("zestawy_danych.txt", ios::in); // Otwarcie pliku w trybie odczytu
            if(plik.good()==false) // Sprawdz, czy plik istnieje
            {
                cout << "Nie znaleziono istniejacego pliku. Byc moze jeszcze go nie stworzyles, badz usunales go z folderu.";
                plik.close();
                cout <<endl<<"Wcisnij ENTER, aby zakonczyc program.";
                cin.ignore();
                getchar();
                exit(0);  // Wyjdz z programu
            }
            else  // Wykonaj, jesli plik istnieje
            {
                int ilosc_linii; // Zmienna przechowujaca ilosc linii w pliku tekstowym
                string linia; // Zmienna przechowująca zawartość linii
                while(getline(plik, linia)) // Dokonaj inkrementacji zmiennej ilosc_linii, dopoki w pliku są linie
                {
                        ilosc_linii++;
                }
                ile=ilosc_linii/3;  // Zmienna okreslajaca wielkosc tablicy, czyli ilosc zestawow (jeden zestaw to trzy linie, zatem dzielimy ilosc linii przez 3)
                imie = new string [ile]; // Utworzenie tablicy do imion
                nazwisko = new string [ile]; // Utworzenie tablicy do nazwisk
                nr_tel = new int [ile]; // Utworzenie tablicy do numerow telefonow
                int nr_linii=1; // Zmienna przechowujaca numer linii
                while(getline(plik, linia))
                {
                    switch(nr_linii)
                    {
                        case 1: *imie=linia; break;
                        case 2: *nazwisko=linia; break;
                        case 3: *nr_tel=atoi(linia.c_str()); break;
                    }
                    if(nr_linii==3) {nr_linii=0; imie++; nazwisko++; nr_tel++;} // Jesli odczytano linie trzecia, przyjmij numer kolejnej linii za 1
                    nr_linii++;                                                 // i przestaw wskazniki o jedna 'szufladke' do przodu
                }
                imie-=ile;      //
                nazwisko-=ile;  //   Przestaw wskazniki do ich oryginalnej pozycji
                nr_tel-=ile;    //
                for(int i=0; i<ile; i++) // Wyswietl kolejno imie, nazwisko i numer telefonu i przestaw wskazniki do przodu
                {
                    cout << endl << *imie;
                    cout << endl << *nazwisko;
                    cout << endl << *nr_tel;
                    imie++; nazwisko++; nr_tel++;
                }
                plik.close();  // Zamknij plik
                delete [] imie; delete [] nazwisko; delete [] nr_tel;   // Zwolnij pamiec
                break;   // Przerwij case'a
            }
        }

W pliku tekstowym znajduje się to:


Tomasz
Konieczny
849586848
Julia
Kowalska
773664882


Natomiast na konsoli wyświetla mi się to:

Wygląda to tak, jakby wyświetlały mi się adresy, pod którymi zapisano numery telefonów (może być to też co innego), a imiona i nazwiska są pomijane. Co może być tego przyczyną? 

1 odpowiedź

+1 głos
odpowiedź 16 czerwca 2022 przez Oscar Nałogowiec (29,290 p.)
wybrane 16 czerwca 2022 przez Noizz00
 
Najlepsza
Czytasz plik do końca (linie 17-20) a potem próbujesz czytać dalej (linie 26-36)?

Plik trzeba "przewinąć na początek" (seekg). Można tez zamknąć plik i otworzyć ponownie.

Jeśli działasz ma tablicach to może warto byłoby zapisać liczbę pozycji na początku pliku?

Ciągle nie przywracasz wskaźników przed delete [].
komentarz 16 czerwca 2022 przez Noizz00 Użytkownik (910 p.)
Zamknięcie pliku i ponowne otwarcie naprawiło sprawę, dzięki. Nie miałem pojęcia, że program nie będzie automatycznie zaczynał od 1 linii przy kolejnym getline, będę teraz chociaż bardziej na to uważał :)

Podobne pytania

+1 głos
1 odpowiedź 287 wizyt
0 głosów
1 odpowiedź 192 wizyt
pytanie zadane 21 lutego 2019 w C# przez Shimeo7 Obywatel (1,910 p.)
0 głosów
1 odpowiedź 359 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez vishi7 Początkujący (430 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 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!

...