driver1995 Temat założony przez niniejszego użytkownika |
Dane z pliku.. » 2009-05-24 13:26:52 Witam... Mam pytanie... Powiedzmy, że robie sobie dokument txt w którym mam jakieś dane, np ceny jakichś produktów: Nazwa Cena Ilosc
Chipsy 2.00 2 Ser 5.00 3 ?Farrari :P 1500000.99 1 I pytanie brzmi: Jak to odczytać w programie (żeby móc np. obliczyć sumę cen, różnicę cen, różnicę ilości, sumę, wpisać nową cenę, nową ilość)... Tak ogółem mówiąc to z pliku tekstowego chcę zrobić tablicę i nie wiem jak się do tego zabrać ;/ ;/ ;/ |
|
driver1995 Temat założony przez niniejszego użytkownika |
» 2009-05-24 14:22:34 No mniej więcej o to... Tylko czy to jest jedyny sposób? Czy trzeba używać aż tylu bibliotek? No bo jakoś tak nie wszystko dokładnie rozumiem... I widziałem też gdzieś (nie pamiętam gdzie) kod gdzie właśnie było to wywoływane krócej i za pomocą 3 czy nawet 2 bibliotek... Tylko najgorsze że nie pamiętam ni krzty ;/ ;/ Proszę o kolejne propozycje;d |
|
pekfos |
» 2009-05-24 14:50:11 daj fstream i getline(plik,str,' ') pobierasz teksty kolejno do tablicy stringow (nazwa, cena, ilosc) i masz to jako teksty. później konwertujesz sobie tekst na liczby (cena i ilosc) (cena musi byc zapisana jako 120 a nie 1.20 (później podzielisz przez 100)) konwertujesz tak: int convert( string t ) { int l = 0; for( int a = 0; a < t.length(); a++ ) { if( t[ a ] >= 48 && t[ a ] <= 57 ) l = l * 10 +( int ) t[ a ] - 48; } return l; } kod wykonaj sam:) //edit: albo zrób tak: #include <fstream> #include <iostream>
using namespace std;
int conv( string w ) { int l = 0; for( int a = 0; a < w.length(); a++ ) { if( w[ a ] >= 48 && w[ a ] <= 57 ) l = l * 10 +( int ) w[ a ] - 48; } return l; }
class item { string nazwa; int cena, ilosc; public: item(); double dajCene(); int dajIlosc(); string dajNazwe(); void dodajIlosc( int ); void dodajCene( int ); void dodajNazwe( string ); };
item::item() { cena = 0; ilosc = 0; nazwa = ""; } double item::dajCene() { return cena / 100; } int item::dajIlosc() { return ilosc; } string item::dajNazwe() { return nazwa; } void item::dodajIlosc( int _ilosc ) { ilosc = _ilosc; } void item::dodajCene( int _cena ) { cena = _cena; } void item::dodajNazwe( string _nazwa ) { nazwa = _nazwa; }
item * realloc( item * d, int size, int ilosc ) { item * data = new item[ ilosc ]; for( int a = 0; a < size; a++ ) { data[ a ] = d[ a ]; } return data; }
enum ITEM_STATUS { IT_NAZWA, IT_CENA, IT_ILOSC };
item parse_data( string d ) { item a; string * b = new string[ 3 ]; ITEM_STATUS it = IT_NAZWA; for( int c = 0; c < d.length(); c++ ) { if( d[ c ] == ' ' && it == IT_NAZWA ) it = IT_CENA; else if( d[ c ] == ' ' && it == IT_CENA ) it = IT_ILOSC; else if( it == IT_NAZWA ) b[ 0 ] += d[ c ]; else if( it == IT_CENA ) b[ 1 ] += d[ c ]; else if( it == IT_ILOSC ) b[ 2 ] += d[ c ]; } a.dodajNazwe( b[ 0 ] ); a.dodajCene( conv( b[ 1 ] ) ); a.dodajIlosc( conv( b[ 2 ] ) ); delete[] b; return a; }
item * getItemsFromFile( const char * _f ) { fstream plik; plik.open( _f, ios::in ); string buffer; int size = 1; item * data = new item[ size ]; getline( plik, buffer ); data[ size - 1 ] = parse_data( buffer ); while( !plik.eof() ) { size++; data = realloc( data, size - 1, size ); getline( plik, buffer ); data[ size - 1 ] = parse_data( buffer ); } return data; }
int main() { item * data = getItemsFromFile( "przedmioty.txt" ); for( int a = 0; a < 3; a++ ) cout << data[ a ].dajNazwe() << endl << data[ a ].dajCene() << endl << data[ a ].dajIlosc() << endl << endl; getchar(); return 0; }
skoro nie chcesz STL tylko iostream i fstream:) |
|
pixelmaster |
» 2009-05-24 18:23:49 można coś takiego #include <stdio.h>
FILE * plik; char nazwa[ 250 ]; double cena; int ilosc;
if( !( plik = fopen( "plik.txt", "r" ) ) ) { printf( "Nie mozna otworzyc pliku!" ); exit( 0 ); }
if( !fscanf( plik, "%s %d %d", & nazwa, & cena, & ilosc ) || cena < 0 || ilosc < 0 ) { printf( "Niepoprawne dane w pliku!" ); exit( 0 ); }
fclose( plik );
i sczytywanie w jakąś pętle for np. |
|
driver1995 Temat założony przez niniejszego użytkownika |
» 2009-05-24 18:50:01 Redagując wszystkie propozycje najlepsza wydaje mi się pierwsza (manfreda)... Teoretycznie mógłbym skopiować cały kod i by poszło, ale wole go zrozumieć, w związku z tym mam parę pytań: 1. Do czego służą biblioteki <vector>, <iterator>, <algorithm> ??? 2. Czemu "double cena;" jest brzydko??? 3. Czemu przy linijce z istream..operator nie ma const a przy ostream jest (tam gdzie item)??? 4. Co oznacza "/t" ??? (slash odwrotnie tylko nie chciał się napisać) 5. Tego nie rozumiem: vector < item > rzeczy; item temp; copy( istream_iterator < item >( plik ), istream_iterator < item >(), back_inserter( rzeczy ) );
copy( rzeczy.begin(), rzeczy.end(), ostream_iterator < item >( cout, "\n" ) ); 6. Czy to wszystko (ewentualnie z drobnymi przeróbkami) można zrobić w allegro??? |
|
driver1995 Temat założony przez niniejszego użytkownika |
» 2009-05-24 19:36:24 6. Chodzi mi o to, że chce to zrobić w allegro, i chodzi mi to to czy to będzie inaczej wyglądało.....
Do reszty nie mam pytań :P:P:P |
|
driver1995 Temat założony przez niniejszego użytkownika |
» 2009-05-24 19:49:04 Wiem... Ale chodzi mi o to, że obok allegro i to użyte, czyli: #include<allegro.h> #include<fstream>
|
|
DeBugger |
» 2009-05-24 20:39:58 Mogą. |
|
« 1 » 2 |