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

Wczytywanie z pliku do tablicy dynamicznej bez znajomości jej wielkości

Object Storage Arubacloud
0 głosów
2,435 wizyt
pytanie zadane 17 maja 2017 w C i C++ przez mibdbz Gaduła (4,300 p.)

Dzień dobry. Otóż mój problem polega na tym, że nie wiem jak utworzyć tablicę dynamiczną z nieznanym wcześniej rozmiarem. Potrafię wczytać dane z pliku:

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;



void zpliku(string);

int main()
{
    string produkt = "owoce.txt";
    zpliku(produkt);

    return 0;
}

void zpliku(string tytul)
{
fstream plik;
    string nazwa[50]; float WW[50]; float WBT[50];
    int nr_linii = 1;

    plik.open(tytul.c_str(), ios::in);


    if(plik.good()==false)
    {
        cout << "Nie udalo sie otworzyc pliku!";
    }
    string linia; int licznik = 0;
    while(getline(plik, linia))
    {
         switch(nr_linii)
        {
            case 1: nazwa[licznik] = linia;              break;
            case 2: WW[licznik] = atof(linia.c_str());   break;
            case 3: WBT[licznik] = atof(linia.c_str());  break;
        }
        if(nr_linii==3) {nr_linii=0; licznik++;}
        nr_linii++;
    }
    plik.close();

    for(int i = 0; i < licznik; i++)
    {
        cout << nazwa[i]    << endl;
        cout<< WW[i]        << endl;
        cout << WBT[i]      << endl;
    }
}

Potrafię też tworzyć tablicę dynamiczną, ale aby jej użyć muszę wiedzieć jaki będzie jej rozmiar:

#include <iostream>

using namespace std;

int main()
{
    string *tablica;
    tablica = new string[ile];


    for (int i = 0; i < ile; i++)
    {
        //kod
    }

    delete [] tablica;
    return 0;
}

tylko jaka ma być wielkość tego "ile" tworzonej tablicy dynamicznej. Musiałbym poznać ilość wierszy w pliku tekstowym, a chodzi o to abym mógł wczytywać plik jakiejkolwiek wielkości. Wielkość mogę poznać, ale dopiero po przeprowadzonej operacji wczytywania co wymusza wcześniejsze utworzenie zwykłych tablic "nazwa" , "WW" i "WBT". Chodzi o to żebym nie marnował pamięci na utworzenie tak dużych tablic jeśli tak dużych w danym momencie nie potrzebuję.

Mam nadzieję, że udało mi się opisać mój problem. Z góry dziękuję za odpowiedzi.

Pozdrawiam.

1 odpowiedź

0 głosów
odpowiedź 17 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Słowo klucz: std::vector<>
komentarz 17 maja 2017 przez mibdbz Gaduła (4,300 p.)
Niestety jeszcze tego nie poznałem. Widzę, że będę musiał porzucić mój nieduży projekt i wrócić do niego jak się podszkolę.
komentarz 17 maja 2017 przez Evelek Nałogowiec (28,960 p.)

Przykład realokacji pamięci dla tablicy:

#include <iostream>
using namespace std;

int main() {
	size_t elements = 1;
	int *tab1 = new int[elements];
	tab1[0] = 0;
	elements++;

	//realokacja pamieci i przepisanie elementow z poprzedniej tablicy
	int *tab2 = new int[elements];
	for (size_t i = 0; i < elements - 1; ++i) {
		tab2[i] = move(tab1[i]);
	}
	delete[] tab1;
	//dodanie nowego elementu
	tab2[1] = 1;
	elements++;

	//realokacja pamieci i przepisanie elementow z poprzedniej tablicy
	int *tab3 = new int[elements];
	for (size_t i = 0; i < elements - 1; ++i) {
		tab3[i] = move(tab2[i]);
	}
	delete[] tab2;
	//dodanie nowego elementu
	tab3[2] = 2;


	for (size_t i = 0; i < elements; ++i)
		cout << tab3[i] << endl;
	delete[] tab3;

	cin.get();
}

Przejrzysty przykład z vectorem:

#include <iostream>
#include <vector>
using namespace std;

int main() {
	vector<int> vec;

	//dodaje element...
	vec.push_back(1);

	//potem kolejny...
	vec.push_back(2);

	//i nastepny...
	vec.push_back(3);
	//koniec

	//wypisanie elementow
	for (auto &x : vec)
		cout << x << " ";

	//ewentualnie jesli sie zna przewidywana ilosc elementow tego vectora
	//mozna od razu zarezerwowac potrzebna ilosc pamieci w celu unikniecia
	//realokacji pamieci dla vectora i przenoszenia jego elementow z miejsca na miejsce
	vector<int> vec_2;
	vec_2.reserve(5);

	//dodaje element...
	vec_2.push_back(1);

	//potem kolejny...
	vec_2.push_back(2);

	//i nastepny...
	vec_2.push_back(3);
	//koniec

	//wypisanie elementow
	for (auto &x : vec_2)
		cout << x << " ";

	cin.get();
}

 

Podobne pytania

0 głosów
2 odpowiedzi 617 wizyt
0 głosów
1 odpowiedź 775 wizyt
pytanie zadane 23 stycznia 2017 w C i C++ przez Don Corleone Obywatel (1,210 p.)
+1 głos
1 odpowiedź 181 wizyt

92,551 zapytań

141,399 odpowiedzi

319,529 komentarzy

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

...