Veranez Temat założony przez niniejszego użytkownika |
Wczytywanie danych z pliku tekstowego » 2016-11-13 18:59:45 Witam, mam pewien problem z wczytywaniem danych z pliku w pętli for #include <iostream> #include <conio.h> #include <fstream> #include <string>
using namespace std;
int wplacajacy;
struct sponsorzy { string nazwisko; double kwota; };
int main() { fstream plik; plik.open( "dokument.txt" ); cout << "Liczba wplacajacych: "; plik >> wplacajacy; cout << wplacajacy << endl; sponsorzy * wsk = new sponsorzy[ wplacajacy ]; for( int i = 0; i < wplacajacy; i++ ) { cout << i + 1 << ") Nazwisko: "; getline( plik, wsk[ i ].nazwisko ); cout << " Kwota: "; plik >> wsk[ i ].kwota; } cout << "\nNasi wspaniali sponsorzy\n"; for( int i = 0; i < wplacajacy; i++ ) { if( wsk[ i ].kwota >= 10000 ) cout << wsk[ i ].nazwisko << endl; } cout << "\nNasi sponsorzy\n"; for( int i = 0; i < wplacajacy; i++ ) cout << wsk[ i ].nazwisko << endl; getch(); return 0; }
W pliku tekstowym mam dokladnie tak 4 Sam Stone 2000 Freida Flass 100500 Tammy Tubbs 5000 Rich Raptor 55000 Jakby ktoś mógł rozjaśnić troszkę temat, byłbym wdzięczny |
|
karambaHZP |
» 2016-11-13 20:12:52 Sposób wczytywania danych jest niedopasowany do zawartości pliku. |
|
Veranez Temat założony przez niniejszego użytkownika |
» 2016-11-13 21:33:04 No teorytycznie getline() powinien pobrać cały wiersz i zapisać do zmiennej string |
|
michal11 |
» 2016-11-13 22:10:37 Przeczytaj dokładnie Obsługa strumienia wejściowegoPonieważ mieszasz getline z operatorem >> to w buforze zostają ci znaki przejścia do nowej linii i dlatego źle ci wczytuje dane, wystarczy czyścic bufor po każdym wczytaniu operatorem >> i będzie dobrze. |
|
Veranez Temat założony przez niniejszego użytkownika |
» 2016-11-13 22:22:30 A mógłbyś mi to poprawić bo jak użyję cin.clear() i cin.sync() to też nici, plik.clear() i plik.sync() też nie, a jak użyję cin.ignore() to nie wczytuje też tej liczby na początku. :/ |
|
carlosmay |
» 2016-11-13 23:02:03 #include <iostream> #include <limits> #include <fstream> #include <string>
struct Patron { std::string fulname; double amt; template < class InputStream > friend InputStream & operator >>( InputStream & input, Patron & patron ) { std::getline( input, patron.fulname ); input >> patron.amt; input.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); return input; } template < class OutputStream > friend OutputStream & operator <<( OutputStream & output, const Patron & patron ) { output << patron.fulname.data() << '\n' << patron.amt; return output; } };
template < class InputStream > std::size_t readSizeArrFromFile( InputStream & input ) { std::size_t size; input >> size; input.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); return size; }
template < class OutputStream > void writeSizeArrToFile( std::size_t size, OutputStream & output ) { output << size << '\n'; }
template < class T, class InputStream > void readFromStreamToArray( T arr[], std::size_t size, InputStream & input ) { for( std::size_t i = 0; i < size; ++i ) { input >> arr[ i ]; } }
template < class T, class OutputStream > void writeToStreamFromArray( T arr[], std::size_t size, OutputStream & output ) { for( std::size_t i = 0; i < size; ++i ) { output << arr[ i ] << '\n'; } }
int main() { std::ifstream fin( "test.txt" ); std::size_t patronsSize { }; Patron * patrons = nullptr; if( fin.is_open() ) { patronsSize = readSizeArrFromFile < std::ifstream >( fin ); patrons = new Patron[ patronsSize ]; readFromStreamToArray < Patron, std::ifstream >( patrons, patronsSize, fin ); writeToStreamFromArray < Patron, std::ostream >( patrons, patronsSize, std::cout ); } else { std::cerr << "file not opened\n"; } std::ofstream fout( "test2.txt" ); if( fout.is_open() ) { writeSizeArrToFile < std::ofstream >( patronsSize, fout ); writeToStreamFromArray < Patron, std::ofstream >( patrons, patronsSize, fout ); } if( fin.is_open() ) { delete[] patrons; } } Sam Stone 2000 Freida Flass 100500 Tammy Tubbs 5000 Rich Raptor 55000 |
|
Veranez Temat założony przez niniejszego użytkownika |
» 2016-11-14 07:30:57 Wszystko byłoby OK, gdyby nie fakt, że niewiele z tego co napisałeś rozumiem :P, Jednakże dzięki za dobre chęci |
|
carlosmay |
» 2016-11-14 08:17:53 std::getline( input, patron.fulname ); input >> patron.amt; input.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); To jest rozwiązanie twojego problemu. Szablony dały tyle, że teraz możesz wczytać dane do tablicy z dowolnego strumienia, przekazując odpowiedni parametr szablonu i obiekt strumienia. Tutaj możesz input zastąpić standardowym lub plikowym strumieniem wejściowym. |
|
« 1 » 2 |