Odczyt pliku .txt i zapisanie do do tablicy

0

Witajcie!

Oto zawartość pliku tekstowego:

Numer;Powierzchnia;Rodzaj;Ulga
517/10;1293,99;B;B
517/11;971,09;B;A
517/12;1259,19;R;B
517/13;753,68;B;C
517/14;1107,02;R;C
517/15;1246,00;B;A
517/16;1225,80;B;A

Chciałbym zapisać te dane kolejno do tablic string, float, string string lub umożliwić sobie w jakiś sposób działanie na tych 4 danych w linii.
Kleiłem trochę kodu, ale albo źle wczytuje albo wywala błędem.

Jak zacząć wczytywać od drugiej linii?
Proszę o pomoc!

Ta wersja printuje same zera..

#include <iostream>
#include <fstream>

using namespace std;

double b[50000];
string a[50000],c[50000],d[50000];

int main()
{
    fstream dzialki;
    dzialki.open("DZIALKI.TXT", ios_base::in);  // in, ze wprowadzam dane Z pliku do programu

    if(!dzialki.good())
    {
        cout << "Blad!" << endl;
        return -1;
    }
    int nr_linii=1;
    string linia;
    while(getline(dzialki, linia))
    {
        dzialki >> a[nr_linii-1] >> b[nr_linii-1] >> c[nr_linii-1] >> d[nr_linii-1];
        nr_linii++;
        cout << a[nr_linii-1] << " " << b[nr_linii-1] << " " << c[nr_linii-1] << " " << d[nr_linii-1] << endl;
    }
    cout << endl << a[3] << " " << b[3] << " " << c[3] << " " << d[3] << endl; // przykladowy

    dzialki.close();

    return 0;
}


Ta natomiast nie pobiera ostatniego stringa, i zamiast pobrać liczbę z przecinkiem to rozdziela ją tak

517/10 1293 ,99 B // powinno być jeszcze B, ale widzę że traktuje liczbę 1293,99 jako inta i stringa

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream dzialki;
    dzialki.open("DZIALKI.TXT", ios_base::in);  // in, ze wprowadzam dane Z pliku do programu

    if(!dzialki.good())
    {
        cout << "Blad!" << endl;
        return -1;
    }
    string linia;
    while(getline(dzialki, linia))
    {
        double b;
        string a,c,d;
        dzialki >> a >> b >> c >> d;
        cout << a << " " << b << " " << c << " " << d << endl;
    }
    dzialki.close();

    return 0;

Miałem jeszcze 3 kod, działał w miarę dobrze, tylko sypał się gdy zamiast ; napotkał nową linię, co skutkowało zapisem
B
517/13

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream dzialki;
    dzialki.open("DZIALKI.TXT", ios_base::in);  // in, ze wprowadzam dane Z pliku do programu

    if(!dzialki.good())
    {
        cout << "Blad!" << endl;
        return -1;
    }
    string linia;       
    int nr_linii=2;     // w notatniku od 1, tu od 2 bo warunki zadania
    while(getline(dzialki, linia, ' '))     // istream & getline( char * odczytane_dane, streamsize ilosc_danych, char znak_konca_linii );
    {
        a[nr_linii-2] = linia;
        cout << linia << " ";
        nr_linii++;    
    }
    dzialki.close();

    return 0;
}
1
while(getline(dzialki, linia))
    {
        double b;
        string a,c,d;
        dzialki >> a >> b >> c >> d;

Jaki sens ma wczytanie linii do zmiennej linia, a potem ignorowanie tego?

Twoim problemem jest:

  1. złe dane w porównaniu do używanego locale: zapewne iostream spodziewa się kropki, a nie przecinka
  2. niepoprawne wczytywanie
0
  1. zauważyłem, tylko nie wiem jak zamienić , na . używając c++ mam już wszystko wpisane to tablicy stringów
#include <iostream>
#include <fstream>

using namespace std;

string a[5001];
string b[5001];
string c[5001];
string d[5001];         //plik tekstowy ma 5001 linii, przy 5000 krzaczy program

int main()
{
    fstream dzialki;
    dzialki.open("DZIALKI.TXT", ios_base::in); 

    if(!dzialki.good())
    {
        cout << "Blad!" << endl;
        return -1;
    }
    int nr=0;
    while(true)
    {
        if(dzialki.good())
        {
            dzialki >> a[nr] >> b[nr] >> c[nr] >> d[nr];
            cout << a[nr] << " " << b[nr] << " " << c[nr] << " " << d[nr] << endl;
            nr++;
        }
        else   break;
    }
    dzialki.close();

    return 0;
}

Teraz lepiej?
Jak pominąć pierwszą linię?
Jak zamienić , na . ?
Jak przekonwertować string na float?

Czy może moje rozumowanie jest zbyt proste, proszę o radę...

1
#include <string>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;

struct Data
  {
   string Numer;
   double Powierzchnia; 
   string Rodzaj,Ulga;
   friend istream &operator>>(istream &s,Data &d)
     {
      string str;
      getline(s>>ws,d.Numer,';');
      getline(s>>ws,str,';');
      getline(s>>ws,d.Rodzaj,';');
      getline(s>>ws,d.Ulga);
      size_t p=str.find_first_of(',');
      if(p!=string::npos) str[p]='.';
      char *end=nullptr;
      d.Powierzchnia=strtod(str.data(),&end);
      if(*end) s.fail();
      return s;
     }
  };
  
typedef vector<Data> DataArray;

int main()
  {
   ifstream fin("DZIALKI.TXT");
   DataArray array;
   copy(istream_iterator<Data>(fin),istream_iterator<Data>(),back_inserter(array));
   for(Data d:array) cout<<d.Numer<<'\t'<<d.Powierzchnia<<'\t'<<d.Rodzaj<<'\t'<<d.Ulga<<endl;
   return 0;
  }
3

Po pierwsze stwórz strukturę, będzie dużo łatwiej:

enum RodzajDzialki
{
      RodzajDzialkiNieznany,
      RodzajDzialkiRolna,
      RodzajDzialkiBudowlana,
      RodzajDzialkiPrzemyslowa
};

enum UlgaPodatkowa
{
      UlgaPodatkowaBrak,
      UlgaPodatkowaA,
      UlgaPodatkowaB
};

struct Dzialka {
   string numer;
   double powierzchnia;
   enum RodzajDzialki rodzaj;
   enum UlgaPodatkowa ulga;
};

std::istream& operator>>(std::istream &in, RodzajDzialki& rodzaj)
{
     std::string s;
     if (std::getline(in, s, ';')) {
         if (s=="A") {
               rodzaj = RodzajDzialkiRolna;
         } if (s=="B") {
               rodzaj = RodzajDzialkiBudowlana;
         } else {
              in.setstate(std::ios::failbit);
         }
     }
     return in;
}

std::istream& operator>>(std::istream &in, UlgaPodatkowa& ulga)
{
    // podobnie jak wyżej
}

std::istream& operator>>(std::istream &in, Dzialka& dzialka)
{
     std::getline(in, dzialka.numer, ';') >> dzialka.powierzchnia;
     std::string dummy;
     return std::getline(in, dummy, ';') >> dzialka.rodzaj >> dzialka.ulga;
}

Pozostaje jeszcze problem separatora dziesiętnego.
Ten problem należy rozwiązać ustawiając właściwe locale dla strumienia http://www.cplusplus.com/reference/ios/ios_base/imbue/

fstream dzialki;
dzialki.open("DZIALKI.TXT", ios_base::in);
std::locale pllocale("pl_PL");   // polish locale
dzialki.imbue(pllocale);
…

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