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

odczytywanie bloków danych z plików tekstowych.

Ostatnio zmodyfikowano 2009-05-15 19:15
Autor Wiadomość
GRrr
Temat założony przez niniejszego użytkownika
odczytywanie bloków danych z plików tekstowych.
» 2009-05-15 10:42:08
mam sobie np. taki tekst w pliku:
xxx xzy 32 dfs dsa
sa dfs asdf dsa gdsa
q qwqw sa asl lkl

jak najprościej odczytać i wyodrębnić poszczególne "wyrazy" z takiego pliku.
Chodzi mi o jak najmniejszą złożoność czasową, bo mam na całe zadanie ok 10 min. a odczytanie danych z pliku jest tylko jednym z elementów zadania.

Myślałem o pobieraniu całych lini tekstu a później za pomocą jakieś funkcji(jakiej?) podzielić stringa na poszczególne wyrazy. Tylko czy taka funkcja istnieje i jak się nazywa.(do rozdzielania sringa na poszczególne wyrazy - coś jak funkcja split w pythonie)
Wiem, że mógłbym szukać kolejnych białych znaków i na tej podstawie wyodrębniać poszczególne wyrazy, ale na to może nie starczyć mi czasu.

Pomożecie, dopiero co zaczynam przygodę z c++ i niezbyt mam pojęcie o tym jak będzie lepiej(szybciej).

dzięki za ew. odpowiedzi :)

P-6859
GoldWolf
» 2009-05-15 12:27:24
C/C++
#include <iostream>
#include <conio.h>
#include <fstream>
const short MAX = 20; // dla 20 wyrazow

int main() {
   
    using namespace std;
    char znaki[ MAX ][ 100 ];
    short i = 0;
   
    //otwierasz plik i :
    plik >> znaki[ i ];
}
P-6862
GRrr
Temat założony przez niniejszego użytkownika
» 2009-05-15 13:45:57
/home/marcin/tojestto.cpp|12|error: no match for ‘operator>>’ in ‘plik >> znaki’|

C/C++
#include <iostream>

#include <fstream>
const short MAX = 20; // dla 20 wyrazow

int main() {
   
    using namespace std;
    char znaki[ MAX ][ 100 ];
    short i = 0;
    fstream plik( "plik.txt", ios::in | ios::out );
    plik >> znaki; // coś chyba nie tak tutaj,
    for( i = 0; i < 100; i++ ) {
        cout << znaki[ i ][ i ] << endl;
    }
   
}

Dante: to nie to o co pytałem, chodzi mi o to np: ze jak mam  stringa: "ala ma kota"
 to mi dana funkcja, o którą pytam, rozbije mi ten ciąg na 3 odrębne słowa.
ten twój program to robi? mi się wydaje ze nie a nie jestem w stanie tego sprawdzić bo mi wywala ten błąd w 12 lini. Co robię źle?
plik.txt istnieje już na dysku.
P-6866
GoldWolf
» 2009-05-15 13:55:59
Na pewno tak ale nie podałem ci dokładnego rozwiązania.

A w ogóle to mówiłeś o odczycie a nie o zapisie do pliku.
P-6867
malan
» 2009-05-15 16:02:07
Ja bym zrobił tak:

C/C++
#include <iostream>
#include <string>
#include <fstream>
#include <conio.h>
#define MAX 50
using namespace std;
struct JakiesDane
{
    string Dane;
};
//...//
int main()
{
    JakiesDane TablicaDanych[ MAX ];
    fstream Plik( "ble.txt", ios::in );
    string DanePliku;
    string DanePliku1;
    int i = 0;
    int Indeks = 0;
    while( !Plik.eof() ) //Pobieramy dane z całego pliku do jednej zmiennej
    {
        getline( Plik, DanePliku1 );
        DanePliku += DanePliku1;
    }
    do
    {
        if( DanePliku[ i ] == 32 ) //Jeżeli znak to spacja...
        {
            Indeks++; //...to wczytuj dane do następnej tablicy
            DanePliku[ i ] = DanePliku[ i - 1 ]; //"Wyrzucamy" znak spacji   
        }
        TablicaDanych[ Indeks ].Dane += DanePliku[ i ];
        i++;
    } while( i < DanePliku.length() );
   
    for( int i = 0; i < Indeks - 1; i++ ) cout << TablicaDanych[ i ].Dane << endl;
   
    getch();
    return( 0 );
}
Może to i dłuższe rozwiązanie, ale działa ;).
P-6875
malan
» 2009-05-15 16:06:38
plik >> znaki; // coś chyba nie tak tutaj,
Ten znak ">>" zapisuje dane do pliku.
Ten znak "<<" POBIERA dane z pliku.
P-6876
pekfos
» 2009-05-15 16:36:53
ja bym użył getline()
getline( plik, bufor, ' ' );
ostatni parametr to znak kończący wczytywanie:)
P-6877
GRrr
Temat założony przez niniejszego użytkownika
» 2009-05-15 16:58:04
dzięĸi za wasze odpowiedzi :)
myślę, że pomysł z interatorami jest najszybszy do wykonania i najmniej błędów można przy tym popełnić, dlatego też mógłby mi ktoś wytłumaczyć jak te interatory działają dokładnie

jak mam

copy(istream_iterator<string>(plik), istream_iterator<string>(), tablica);
to rozumiem, że pierwszy argument to jest skąd biorę a ostatni gdzie ma się znaleźć treść, jednak jakie zadanie ma ten środkowy argument - ten bez parametru. Rozumiem, że jest to szablon wg którego odbywa się całe kopiowanie tak?

chciałbym zmodyfikować ten kod tak aby wczytywanie danych do tablicy odbywało się liniami
tak aby do tablicy zapisywała się zarówno numer wiersza jak i zawartość poszczególnych kolumn
 mam kod:

C/C++
#include <fstream>
#include <string>
#include <iterator>
#include <algorithm>
#include <iostream>


int main()
{
    using namespace std;
    string tablica[ 600 ]; // rozumiem, że musiałbym mieć tablice 2 wymiarową,
    by pomie ś ci ł a numery wierszy jak i tre ś ć poszczeg ó lnych kolumn
    ifstream plik( "zue.txt" );
    int licznik = 1;
    string wiersz;
    while( getline( plik, wiersz ) ) {
        cout << wiersz << endl;
        copy( istream_iterator < string >( wiersz ), istream_iterator < string >(), tablica );
       
        //tutaj mam coś zle, probowalem kilkanascie kombinacji... ale bez zrozumienia tych iteratorów nie zrobię tego sam.
       
    }
    for( int i = 0; i < 56; i++ ) {
        cout << tablica[ i ] << endl;
    }
}
chodzi mi o to zeby tablica przetrzymywala dane w ten sposób, że
xzy xxx xyz       pierwszy wiersz -3 elementy
xzy xxx xyz       drugi ...
xzy xxx xyz  yyy trzeci wiersz 4 elemnty
czyli tablica[3][4], tak?

dzięki za oświecenie
P-6879
« 1 » 2
  Strona 1 z 2 Następna strona