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ą?