GigaByte23 Temat założony przez niniejszego użytkownika |
[C++/UNIX] Zapis co n-tego elementu z pliku tekstowego do tablic/struktur. » 2015-01-14 10:01:38 Szanowni Forumowicze! Próbuję napisać skrypt który pozwoli zapisywać co któryś wyraz/element z pliku tekstowego, oraz później pozwoli na wyświetlenie poszczególnego elementu, operację na nim. tzn. Zawartość pliku tekstowego: 1. ABC 10 20 30 40 2. XYZ 20 40 60 80 3. BCD 30 60 90 95
Z kolejnych linii chcę pobrać 4 wyraz/element - w tym przypadku 30, 60 i 90, Wiem że te elementy będą powtarzały się co 4 elementy. Pobrane wyrazy powinienem zapisać w elementach struktury lub w osobnych tablicach. Kod który pozwala wyświetlać całe WYRAZY za pomocą 'jakiesdane>>jakisstring' jest zasadniczo prosty: int main() { ifstream in( plik.txt ); string word; while( in >> word ) { cout << word << endl; } return 0; }
I wyświetla każdy wyraz, nie osobną literę/cyfrę: ABC 10 20 30 40 XYZ 20 40 60 80 BCD 30 60 90 95
Na chwilę obecną próbuję cokolwiek zrobić, żeby chociaz wyswietlic juz bez zapisywania co którys element. Bardzo będę wdzięczny za jakiekolwiek wskazówki i pomoc. |
|
darko202 |
» 2015-01-14 11:05:29 musisz chyba zacząć od czytania całych linii czyli getline i potem w string metoda find
lub zobaczyć znaku końca linii i wtedy proste liczenie wyrazu
chyba że plik masz sformatowany i wtedy czytać linię od jakiegoś miejsca (z przykładu nie widać stałego formatowania)
|
|
pekfos |
» 2015-01-14 11:12:01 Dodatkowa zmienna na licznik wyrazów i warunek? |
|
GigaByte23 Temat założony przez niniejszego użytkownika |
» 2015-01-20 23:00:17 Dziękuję za odpowiedzi. Sugerując się nimi dodałem do kodu pętlę: int main() { ifstream in( plik.txt ); string word; while( in >> word ) { for( int i = 0; i < word.size(); i += 3 ) { cout << word[ i ] << endl; } } return 0; }
i jakiś efekt otrzymałem, jednakze program wyświetla mi co 3-cią literkę/cyferkę, a nie całe słowo. |
|
michal11 |
» 2015-01-21 01:41:44 To co zrobiłeś jest bez sensu. Ja bym zrobił tak jak pekfos radzi, dodaj sobie zmienną która będzie się zwiększała przy każdym obiegu pętli. Przykład: while() { if( i == 4 ) { wypisz } if( i == 5 ) { i = 1; } ++i; }
|
|
GigaByte23 Temat założony przez niniejszego użytkownika |
» 2015-01-21 10:42:08 michal11, dziekuje za jakis trop. Czytałem w lekturze o Vectorach, i w sumie coś udało się skleić, co z resztą działa, a mianowicie: int main() { string bufor; vector < string > wyraz; ifstream buford( jakisplik.txt ); while( buford ) { buford >> bufor; wyraz.push_back( bufor ); } cout << "\nWartosci z 3 pola::\n"; for( int i = 0; i < wyraz.size(); i += 3 ) { cout << wyraz[ i ] << endl; }; return( 0 ); }
Pozostaje pytanko, jak te wartości zapisać w tablice, by móc poźniej je np. dodać, pomnożyć? |
|
pekfos |
» 2015-01-21 19:15:48 std::vector < int > vi;
vi.push_back( f( wyraz[ i ] ) ); Gdzie f() to jakiś sposób na konwersję tekstu na liczbę. |
|
michal11 |
» 2015-01-21 19:21:22 Wczytuj je do vectora intów a nie stringów. Skoro wiesz, jak dokładnie wygląda twój plik to możesz zrobić cos takiego: string txt; int p[ 4 ];
while( plik >> txt >> p[ 0 ] >> p[ 1 ] >> p[ 2 ] >> p[ 3 ] ) { }
i wtedy masz wczytywanie każdej linii, w txt masz tekst a w tablicy kolejne liczby. Możesz je wtedy wrzucić do vectora i później coś zrobić, możesz od razu wypisac/mnożyć itp. Btw. Najładniej to byłoby stworzyć sobie strukturę struct line { string text; int p[ 4 ]; };
i przeciążyć funkcję wpisywania ze strumienia istream & operator >>( istream & in, linia & x );
wtedy wpisywanie z pliku wyglądało by tylko tak linia buffor; while( plik >> buffor )
|
|
« 1 » |