Wpis z mikrobloga

Siema Mirki, potrzebuje pomocy. Potrzebna mi funkcja, która otworzy plik, w którym pierwsza liczba w tym pliku oznacza liczbę pozostałych elementow(liczb) w pliku, np.
5
11
222
3333
44444
555555

Następnie funkcja ma wypisac elementy na ekranie oraz wpisac te elementy do istniejącej juz wcześniej w programie tablicy dynamicznej (po prostu tablica odczytana z pliku ma ją zastąpić). Jeśli robie to na pałe w mainie w ten sposob to wszystko dziala:

cin>>nazwa;
fstream plik(nazwa);
plik >> iloscelementow;
tablica1 = new int[ilosc
elementow];
for (int i = 0; i < ilosc_elementow; i++)
{
plik >> tablica1[i];
cout << tablica1[i] << endl;
}
plik.close();

Jednak kiedy zrobilem funkcję:

void odczyt(int *tab, int elementy)
{
string nazwap;
cout << "Podaj nazwe pliku do odczytu" << endl;
cin >> nazwa
p;
elementy = 0;
fstream plik(nazwa_p);
plik >> elementy;
tab = new int[elementy];
for (int i = 0; i < elementy; i++)
{
plik >> tab[i];
cout << tab[i] << endl;
}
plik.close();
}

To tablica wyświetla się na ekranie, jednak po sprawdzeniu czy ==NULL wyskakuje ze jest pusta, a muszę użyć tablicy w dalszej czesci programu. Jakies sugestie?
#naukaprogramowania #cpp
  • 6
@tlusty_bic: bo w żaden sposób nie przekazujesz zaalokowanej tablicy poza funkcję. parametr tab jest lokalny dla funkcji i to że go zmodyfikujesz to nie znaczy że parametr który przekazałeś do funkcji będzie zmodyfikowany.
Użyj referencji na wskaźnik w ten sposób będziesz go w stanie zmodyfikować wewnątrz funkcji. A jeszcze przekaż wskaźnik jako wartość zwracaną przez funkcję. A najlepiej użyj jakiegoś kontenera i nie operuj na gołych wskaźnikach.
@inplaz:

int odczyt(int *tab)
{
string nazwa;
fstream plik;
int elementy;

cout << "Nazwa pliku do odczytu: " << endl;
cin >> nazwa;
plik.open(nazwa, ios::in);
if (plik.good() == false)
{
cout << "plik nie istnieje" << endl;

}
else
{
plik >> elementy;
tab = new int[elementy];
for (int i = 0; i < elementy; i++)
{
plik >> tab[i];
cout << tab[i] << endl;
}
return tab[elementy];
}

}
void
@tlusty_bic: zacznijmy od deklaracji funkcji: void odczyt(int *tab). funkcja jako parametr przyjmuje wskaźnik, a konkretnie jego wartość.
gdy wywołujesz funkcję w sposób odczyt(tablica), wartość wskaźnika(czyli jakiś adres) z tablica jest kopiowany do parametru tab, ale poza wartością początkową zmienna tab nie ma nic wspólnego ze zmienną tablica.
dlatego pierwsza zaproponowana przez ciebie wersja funkcji nie działała tak jak chciałeś.

Opcja 1:
zmieniając deklarację na: void odczyt(int *&tab) pierwsza wersja prawdopodobnie by