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

Wczytywanie danych z pliku tekstowego

Ostatnio zmodyfikowano 2016-11-14 14:26
Autor Wiadomość
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
C/C++
#include <iostream>
#include <conio.h>   // getch()
#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;
       
        //specjalnie nie wyswietlam slowa brak
    }
   
    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
P-153641
karambaHZP
» 2016-11-13 20:12:52
Sposób wczytywania danych jest niedopasowany do zawartości pliku.
P-153646
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
P-153655
michal11
» 2016-11-13 22:10:37
Przeczytaj dokładnie » Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja

Ponieważ 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.
P-153658
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. :/
P-153660
carlosmay
» 2016-11-13 23:02:03
C/C++
#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 ]; // zalecam użyć std::vector
        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" ); // tutaj kontrolny zapis do drugiego pliku
    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
P-153661
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
P-153671
carlosmay
» 2016-11-14 08:17:53
C/C++
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.
P-153672
« 1 » 2
  Strona 1 z 2 Następna strona