Wczytywanie plików z .txt do tablicy.

0

Cześć, mam pytanie jak wczytywać dane z pliku .txt do tablicy.
Mój .txt wygląda jak magazyn. tzn struktura wygląda mniej więcej tak
długopis 30
drukarka 15
ołowek 3
Czyli przedmiot, ilość, chciałbym to wczytywać do tablicy, która ma 2 kolumny, ale ilość wierszy jest różna, ponieważ produkty można dodawać.

1

Ja bym to jednak wczytał do unordered_map<string, int> żeby można było potem wyciągać sobie ilość dla danego produktu w jednym kroku, a nie lecieć pętlą przez tablicę ;)
Co do reszty pytania to nie bardzo rozumiem.

  1. Wczytujesz linię z pliku http://www.cplusplus.com/reference/istream/istream/getline/
  2. Splitujesz tą linię po spacji, żeby dostać nazwę i ilość
  3. Dodajesz do mapy mapa[nazwa] = ilosc i voila
0
#include<iostream>
#include<string>
#include<fstream>
#include<windows.h>
#include<io.h>
#include<cstdlib>
using namespace std;

int wybor;
int wybor_mag;
int liczba_plikow;
string *Nazwy;
string linia;
string a;
int b;

void listowanie(string sciezka, int &liczba_plikow, string *&Tablica);

void listowanie(string sciezka, int &liczba_plikow, string *&Tablica){
	bool folder=false;
	int liczba_elementow=0;
	int licznik=0;
	
	_finddata_t liczbaelementow;
	long uchwyt_0=_findfirst(sciezka.c_str(), &liczbaelementow);
	
	if(uchwyt_0!=-1){
		liczba_elementow++;
		while(_findnext(uchwyt_0, &liczbaelementow)!=-1){
			liczba_elementow++;
		}
	}
	_findclose(uchwyt_0);
	
	if(sciezka.at(sciezka.length()-1)=='.'){
		liczba_elementow-=2;
		folder=true;
	}
	
	if(liczba_elementow>0){
		liczba_plikow=liczba_elementow;
		delete [] Tablica;
		Tablica=new string [liczba_plikow];
		_finddata_t nazwyplikow;
		long uchwyt_1=_findfirst(sciezka.c_str(), &nazwyplikow);
	if(uchwyt_1!=-1){
		fstream plik;
		plik.open(nazwyplikow.name, ios::in);
		if(folder==false){
			Tablica[licznik]=nazwyplikow.name;
		}
		licznik++;
		while(_findnext(uchwyt_1, &nazwyplikow)!=-1){
			fstream plik;
			plik.open(nazwyplikow.name, ios::in);
			if(folder==true && licznik>1){
				Tablica[licznik-2]=nazwyplikow.name;
			}
			else{
				Tablica[licznik]=nazwyplikow.name;
			}
			licznik++;
		}
	}
	_findclose(uchwyt_1);
}
}

void menu(){
	cout << "# Menu\n1. Dodaj nowy magazyn.\n2. Wybierz magazyn.\n3. Zamknij program.\nWybierz: ";
	cin >> wybor;
	switch(wybor){
		case 1: {
			system("cls");
			cout << "Podaj nazwe nowego magazynu: ";
			char cFileName[30];
			char cStr[]=".txt";
			cin >> cFileName;
			strncat(cFileName, cStr, 30);
			fstream plik(cFileName, ios::out);
			cout << "Akcja zakonczyla sie sukcesem.\n";
			Sleep(1000);
			system("cls");
			menu();
			break;
		}
		case 2:{
			system("cls");
			cout << "Lista magazynow, dane przechowywane w formacie .txt\n\n";
			listowanie("*.txt", liczba_plikow, Nazwy);
			for(int i=0; i<liczba_plikow; i++){
				cout << Nazwy[i] << endl;
			}
			cout << "\nWejdz do magaznu: ";
			char cFileName[30];
			char cStr[]=".txt";
			cin >> cFileName;
			strncat(cFileName, cStr, 30);
			fstream plik;
			system("cls");
			plik.open(cFileName, ios::in);
			if(plik.good()==true){
				cout << "# Lista produktow w magazynie " << cFileName << "\n";
				while(getline(plik, linia))
				
				cout << linia << endl;
				plik.close();
			}
			cout << "\n# Lista zadan:\n1. Dodaj produkt.\n2. Edytuj ilosc.\n3. Wroc do menu.\nWybierz: ";
			cin >> wybor_mag;
				switch(wybor_mag){
					case 1:{
						ofstream plik(cFileName, ios::app);
						cout << "Nazwa produktu oraz ilosc: ";
						plik.close();
						
						// Tutaj chciałbym dodawać nowe produkty do pliku .txt przykład "drukarka 30".
						// Chciałbym to robić za pomocą niżej zrobionej klasy Towar (takie wymogi zadania).
						
						break;
					}
					case 2:{
						
						//Tutaj chciałbym ładować dane z otwartego pliku .txt do tablicy[nazwa][ilosc], aby móc później wskazać dany produkt
						// oraz edytować jego ilosc.
						
						break;
					}
					case 3:{
						system("cls");
						menu();
						break;
					}
				}
			break;
		}
		case 3:{
			exit(0);
			break;
		}
	}
}

class Towar{
private:
	string nazwa;
	int ilosc;
public:
	Towar(string n, int il):
		nazwa(n), ilosc(il){}
	Towar():nazwa(), ilosc(0){}
	
	void ustaw_dane(string nazwa, int ilosc){
	this->nazwa=nazwa;
	this->ilosc=ilosc;
	}
};

int main(){
	menu();
}

Chciałbym to zrobić tak jak wyżej, ale nie potrafię... w komentarzach objaśnione o co chodzi.

1

Swoją drogą, format Twojego pliku nie jest zbyt fajny. Powinieneś wprowadzić (o ile masz nad tym kontrolę) inny separator pomiędzy nazwą przedmiotu a jego ilością. Łatwo jest sobie strzelić w kolano z taką spacją. Przykład:

długopis;30
drukarka;15
ołowek;3
1

Ale wymodziłeś...

unordered_map<string, int> data;
string name;
int val;
ifstream f("data.txt");
while(f >> name >> val)
    data[name] = val;

1 użytkowników online, w tym zalogowanych: 0, gości: 1