Struct record i fstream, odczyt z pliku

0

Witam, mam problem z zadaniem.

 
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

int main(int argc, char *argv[])
{
    fstream plik;
    plik.open ("data.csv", fstream::in | fstream::out);
    if( plik.good() == true)
    {
        string napis;
		string token;
        cout << "Zawartosc pliku: \n\n";
            
        while( !plik.eof() )
        {
            getline(plik, napis, ';');
            //cout << napis << ";";
			
        }
    } else cout << "Error! Nie udalo otworzyc sie pliku! \n";
    
    cout << "\n\n\n\n";
    system("pause");
    return 0;
}

Jak widzimy program pobiera dane z pliku data.csv. Kazda dana w rekordzie jest oddzielona średnikiem. Np. 1;Imie;Nazwisko;18;Warszawa
Niestety nie mam pojęcia, jak zapisać każdą daną do tablicy, a później wyświetlić załóżmy tylko Lp., nazwisko i wiek.
:(

0

Pobierasz całą linijkę ;] więc potem dla każdej linijki musisz wziąć i rozłożyć ja na czynniki pierwsze, czyli te średniki oddzielają. i wstawić do tablicy dwuwymiarowej (ilość_linii x ilość średników w linii).,
Jeżeli ilość średników i linii jest zawsze stała no to wbij na stałe rozmiary tablicy, a jeśli nie wiesz ile czego jest to musisz to dynamicznie zrobić.

0
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
 
int main()
  {
   ifstream fin("data.csv");
   if(!fin) cerr<<"Error! Nie udalo otworzyc sie pliku!"<<endl;
   else
     {
      vector<vector<string> > tb;
      string line;
      while(getline(fin,line))
        {
         vector<string> row;
         string col;
         isstream sin(line);
         while(getline(sin,col,';')) row.push_back(col);
         if(row.size()) tb.push_back(row);
        }
     }
   //cin.get(); // jeżeli to potrzebujesz to zmień IDE na jakieś z obecnego stolecia
   return 0;
  }
1

jakbyś od razu chciał tworzyć obiekty lecąc po tych linijkach to wykombinowałam coś takiego;

#include <iostream>
#include <string>
#include <cstdlib>

class LineSeparate {
private:
	std::string line, delimiter;
public:
	std::string getNextPart() {
		size_t pos = line.find(delimiter);
		std::string token = line.substr(0, pos);
		line.erase(0, pos + delimiter.length());
		return token;
	}
	LineSeparate(std::string line, std::string delimiter) :
		line(line), delimiter(delimiter) {}
};

class Osoba {
private:
	int lp, wiek;
	std::string imie, nazwisko, miasto;
public:
	Osoba(std::string csvLine) {
		LineSeparate line(csvLine,";");
		lp = atoi(line.getNextPart().c_str());
		imie = line.getNextPart();
		nazwisko = line.getNextPart();
		wiek = atoi(line.getNextPart().c_str());
		miasto = line.getNextPart();
	}
	std::string getNazwisko() {
		return nazwisko;
	}
	int getWiek() {
		return wiek;
	}
	int getLp() {
		return lp;
	}
};

int main(void) {
	std::string csvLinijka = "1;ABC;DEF;18;Warszawa";
	Osoba o(csvLinijka);
	std::cout << o.getLp() << " " << o.getNazwisko();
	std::cout << " " << o.getWiek() << std::endl;
}

ps tak tak wiem ze to jest wersja eng-pol :]

2

@karolinaa, zastanów się nad:

void Osoba::parse(std::istream &s)
  {
   char d1,d2,d3,d4
   s>>std::ws>>lp>>d1>>imie>>d2>>nazwisko>>d3>>wiek>>d4>>miasto;
   if((s)&&((d1!=';')||(d2!=';')||(d3!=';')||(d4!=';'))) s.setf(ios::failbit);
  }

lub:

istream &semicolon(istream &s) { if(';'!=s.get()) s.setf(ios::failbit); return s; }

void Osoba::parse(std::istream &s)
  {
   s>>std::ws>>lp>>semicolon>>imie>>semicolon>>nazwisko>>semicolon>>wiek>>semicolon>>miasto;
  }

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