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 :) |
|
GoldWolf |
» 2009-05-15 12:27:24 #include <iostream> #include <conio.h> #include <fstream> const short MAX = 20;
int main() { using namespace std; char znaki[ MAX ][ 100 ]; short i = 0; plik >> znaki[ i ]; } |
|
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’| #include <iostream>
#include <fstream> const short MAX = 20;
int main() { using namespace std; char znaki[ MAX ][ 100 ]; short i = 0; fstream plik( "plik.txt", ios::in | ios::out ); plik >> znaki; 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. |
|
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. |
|
malan |
» 2009-05-15 16:02:07 Ja bym zrobił tak: #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() ) { getline( Plik, DanePliku1 ); DanePliku += DanePliku1; } do { if( DanePliku[ i ] == 32 ) { Indeks++; DanePliku[ i ] = DanePliku[ i - 1 ]; } 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 ;). |
|
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. |
|
pekfos |
» 2009-05-15 16:36:53 ja bym użył getline() getline( plik, bufor, ' ' ); ostatni parametr to znak kończący wczytywanie:) |
|
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: #include <fstream> #include <string> #include <iterator> #include <algorithm> #include <iostream>
int main() { using namespace std; string tablica[ 600 ]; 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 ); } 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 |
|
« 1 » 2 |