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ć.
- Rejestracja:ponad 7 lat
- Ostatnio:ponad 6 lat
- Postów:2
0

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
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.
- Wczytujesz linię z pliku http://www.cplusplus.com/reference/istream/istream/getline/
- Splitujesz tą linię po spacji, żeby dostać nazwę i ilość
- Dodajesz do mapy
mapa[nazwa] = ilosc
i voila
- Rejestracja:ponad 7 lat
- Ostatnio:ponad 6 lat
- Postów:2
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.
edytowany 1x, ostatnio: Janusz_Morderca

- Rejestracja:ponad 12 lat
- Ostatnio:około miesiąc
- Lokalizacja:Kraków
- Postów:1055
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
edytowany 1x, ostatnio: pingwindyktator