• 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

0 głosów
47 wizyt
pytanie zadane 16 czerwca w C i C++ przez Noizz00 Początkujący (420 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 przez Oscar Nałogowiec (25,590 p.)
wybrane 16 czerwca 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 przez Noizz00 Początkujący (420 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ź 69 wizyt
0 głosów
1 odpowiedź 171 wizyt
pytanie zadane 21 lutego 2019 w C# przez Shimeo7 Obywatel (1,910 p.)
0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez vishi7 Początkujący (350 p.)

88,311 zapytań

136,904 odpowiedzi

305,517 komentarzy

58,593 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...