Miałem mały problem z funkcją skipws bo próbowałem ją użyć na zmiennej buff, czyli nie będącej strumieniem :)
Ale przy szukaniu tego zrozumiałem w końcu to o co pytałem wyżej.
Cały kod podam dla innych do nauki ;)
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
int main () {
char buff[90]; //zrzuca tutaj tylko jedna kolumne
int columnSizes[] = { 10, 5, 5, 12,8,10,18 }; //podaje sie tu szerokosc kolumn w pliku
const int n = sizeof(columnSizes) / sizeof(columnSizes[0]); // dodatek sam policzy ile ma elem.
//licząc bajty; można też ręcznie podać
ifstream plik( "dane.txt" );
string linia; // cala linia z pliku
string ODCZYT; //"wyczyszczony" i oddzielony od innych znak
while( getline( plik, linia) )
{
stringstream s( linia );
cout<<"\n";
for( int column = 0; column<n; ++column )
if( s.get( buff, columnSizes[ column ]+1 ) ) // +1 jest konieczne bo parametr liczy z zerem kończącym
{
stringstream s( buff );
s >>skipws>>ODCZYT;
cout<<ODCZYT<<" ";
}
}
plik.close();
system("PAUSE");
return 1;
}
Co do tego fragmentu
{
1) stringstream s( buff );
2) s >>skipws>>ODCZYT;
cout<<ODCZYT<<" ";
}
- zmienna char buff[90] jest konwertowana na strumień o nazwie s
- dzięki temu możemy się nim posługiwać jak intuicyjnie "jak przy cin>>zmienna"
czyli do zmiennej string (może też być char) ODCZYT zapisuje się już oczyszczony ze spacji (funkcja skipws) wyraz ze strumienia.
Do testów terzeba sobie stworzyć plik z taką szerokością kolumn jak w tabelce.
Co do odczytu 3 zmiennych jednoczesnie, np.
mamy odczyt 12:34:11
int hh,mm,ss;
Kiedyś było coś takiego, nie pamiętam nazwy funkcji
nazwa_funkcji( "%d:%d:%d",hh,mm,ss);
Ale to jest metoda jeszcze z C
nie chciałbym do niej wracać bo teraz skupiam się na streamach i stringach
Czy jest jakiś odpowiednik o takiej funkcjonalności w stream'ach albo stringach?
Generalnie ważne są dwie rzeczy;
- Czy plik jest postaci hhss -> Jeśli Nie to błąd, "zła stuktura danych"
- Jeśli Tak pobierz zmienne hh, mm i ss;
Czyli chodzi o dbanie o prawidłową strukturę danych a dopiero później odczyt.
Jeśli odczytał by np. "aa1255" to mógłby zrobić coś takiego
hh='aa';
mm='12:';
ss='13'; czyli jakieś wartości liczbowe z tego będą ale przez to obliczenia wyjdą błędne.