Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++/UNIX] Zapis co n-tego elementu z pliku tekstowego do tablic/struktur.

Ostatnio zmodyfikowano 2015-01-21 19:21
Autor Wiadomość
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:
C/C++
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.
P-124872
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)
P-124885
pekfos
» 2015-01-14 11:12:01
Dodatkowa zmienna na licznik wyrazów i warunek?
P-124887
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ę:

C/C++
int main()
{
    ifstream in( plik.txt );
    string word;
    while( in >> word ) {
        for( int i = 0; i < word.size(); i += 3 )
        {
            cout << word[ i ] << endl; //wyraz po wyrazie
        }
    }
    return 0;
}

i jakiś efekt otrzymałem, jednakze program wyświetla mi co 3-cią literkę/cyferkę, a nie całe słowo.
P-125284
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:
C/C++
while()
{
    if( i == 4 ) { wypisz }
    if( i == 5 ) { i = 1; }
    ++i;
}
P-125286
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:
C/C++
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ć?
P-125293
pekfos
» 2015-01-21 19:15:48
C/C++
std::vector < int > vi;
//..
vi.push_back( f( wyraz[ i ] ) );
Gdzie f() to jakiś sposób na konwersję tekstu na liczbę.
P-125331
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:
C/C++
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ę
C/C++
struct line
{
    string text;
    int p[ 4 ];
};

i przeciążyć funkcję wpisywania ze strumienia
C/C++
istream & operator >>( istream & in, linia & x );

wtedy wpisywanie z pliku wyglądało by tylko tak
C/C++
linia buffor;
while( plik >> buffor )
P-125334
« 1 »
  Strona 1 z 1