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

wczytywanie danych z pliku txt i ich wyrzucanie, poszukiwanie ze wzgl na dany parametr

Ostatnio zmodyfikowano 2014-03-29 18:06
Autor Wiadomość
Spiritualself
Temat założony przez niniejszego użytkownika
wczytywanie danych z pliku txt i ich wyrzucanie, poszukiwanie ze wzgl na dany parametr
» 2014-03-29 09:46:09
Witam, mam problem z programem bazodanowym gromadzącym informacje o flocie pojazdów w firmie.

1) Muszę wyprowadzić dane z pliku pod nazwą pojazdy.txt na ekran, jednak żadne ifstream plik; plik.open("pojazdy.txt")/  czy  /void open( const char * pojazdy, ios_base::openmode input ) nie działają.

2) Jednym z wymagań jest poszukiwanie pojazdów w oparciu o markę i od kilku godzin siedzę i zastanawiam się jak zrobić, gdyż informatyka to nie mój konik :P

C/C++
#include <iostream>
#include <string>
#include <fstream>
#include <conio.h>
#include <cstdlib>

using namespace std;

int i; //zmienne globalne  

struct Pojazdy
{
    string model, marka; // z pominieciem daty_przegladu; data przegladu znajduje sie w spisie samochodow, jednak nie byla brana pod uwage
    float pojemnosc;
    int rok;
    long int przebieg;
    float cena;
};

Pojazdy dane[ 500 ];


void Dodaj(); //funkcje programu
void Zapisz();
void Edytuj();
void Baza();
void Usun();


int main() //program glowny
{
    int w;
    short x;
   
    cout << "\n W programie zamiast samochodow znajduja sie motocykle!!" << endl;
    cout << "\n 1:Aby wczytac dane o motocyklach z pliku pojazdy.txt";
    cout << "\n 2:Aby utworzyc pusty plik ";
    cout << "\n\n\tPodaj nr opcji: ";
    cin >> x;
   
   
    fstream plik; <----dok ł adnie w tym miejscu zaczynaj ą si ę moje problemy z wyrzuceniem pliku
   
    if( x == 1 )
    {
        void open( const char * pojazdy, ios_base::openmode input );
       
        if( !plik )
        {
            cerr << "\n Blad odczytu/brak znalezionego pliku. Program zostanie zatrzymany" << endl;
            system( "pause" );
            return 0;
        }
        else
        {
            int j = 0;
            do
            {
                plik >> dane[ j ].marka;
                plik >> dane[ j ].model;
                plik >> dane[ j ].pojemnosc;
                plik >> dane[ j ].rok;
                plik >> dane[ j ].przebieg;
                plik >> dane[ j ].cena;
               
                j++;
            }
           
            while( !plik.eof() );
           
            cout << "\n\n\tWczytano dane. Nacisnij ENTER!";
            getchar();
            getchar();
        }
    }
   
    system( "cls" );
    cout << "\n\n\t\t";
   
    do
    {
        cout << "\n   Obecnie w bazie znajduja sie " << i << " jednosladow \n\n";
        cout << "\n   1.Dodaj nowe dane\n";
        cout << "\n   2. Zapis wprowadzonych danych\n";
        cout << "\n   3. Edycja danych\n";
        cout << "\n   4. Odtworz zawartosc bazy\n";
        cout << "\n   5. Usun wpis z bazy\n";
        cout << "\n   6. zakonczenie programu\n ";
       
        /*---wybór opcji---*/
       
        cout << "\n\t  Wybierz opcje: ";
        cin >> w;
        if( w < 0 || w > 5 )
        {
            system( "cls" );
            cout << "\n\n\n\t Niestety nie ma takiej opcji. Prosze wybrac opcje oznaczona liczbami od 1 do 5";
            cout << "\n\n\n\t\tDzialanie programu zakonczono\n\n";
            system( "pause" );
            return 0;
        };
       
        switch( w )
        {
        case 0: cout << "Dzialanie programu zakonczono\n ";
            system( "pause" );
            return 0;
            break;
        case 1: Dodaj();
            break;
        case 2: Zapisz();
            break;
        case 3: Edytuj();
            break;
        case 4: Baza();
            break;
        case 5: Usun();
            break;
        }
       
        system( "cls" );
    }
    while( w != 0 );
   
    cin.ignore();
    getchar();
    return 0;
}

/*zakonczenie programu głównego*/

/*Funkcja - wczytanie danych z istniejącego pliku pojazdy.txt */

void Wczytaj()
{
    ifstream plik( "pojazdy.txt", ios::in );
    plik >> i;
    if( !plik )
    {
        cout << "\n\n\t\tBrak pliku - program zostanie zakonczony";
        cout << "\n\n\t\t";
        system( "pause" );
    }
    else
    {
        int j = 0;
        do
        {
            plik >> dane[ j ].marka;
            plik >> dane[ j ].model;
            plik >> dane[ j ].pojemnosc;
            plik >> dane[ j ].rok;
            plik >> dane[ j ].przebieg;
            plik >> dane[ j ].cena;
            j++;
        }
        while( !plik.eof() );
       
        cout << "\n\n\tWczytano dane. Nacisnij ENTER!";
        getchar();
        getchar();
    } }

/* Dodanie nowego rekordu do bazy danych*/
void Dodaj()
{
   
    cout << "\n\n\t\tPodaj marke motocykla : ";
    cin >> dane[ i ].marka;
    cout << "\n\n\t\tPodaj model motocykla : ";
    cin >> dane[ i ].model;
    cout << "\n\n\t\tPodaj pojemnosc motocykla w cm szesciennych: ";
    cin >> dane[ i ].pojemnosc;
    cout << "\n\n\t\tPodaj rocznik motocykla: ";
    cin >> dane[ i ].rok;
    cout << "\n\n\t\tPodaj przebieg motocykla: ";
    cin >> dane[ i ].przebieg;
    cout << "\n\n\t\tPodaj cene motocykla: ";
    cin >> dane[ i ].cena;
    i++;
    cin.ignore();
    cout << "\n\n\t\tWcisnij dowolny klawisz";
    getchar();
}

/*zapisanie rekordu do pliku tekstowego */
void Zapisz()
{
    ofstream plik( "baza.txt", ios::trunc );
    plik << i << "\n";
   
    for( int j = 0; j < i; j++ )
    {
        plik << dane[ j ].marka << "\n";
        plik << dane[ j ].model << "\n";
        plik << dane[ j ].rok << "\n";
        plik << dane[ j ].przebieg << "\n";
        plik << dane[ j ].cena << "\n";
    }
   
    cout << "\n\n\t\tDane zostaly zapisane! \n\n\t\t";
    system( "pause" );
   
}

/*Funkcja wyświetla zawartość bazy danych*/
void Baza()
{
    int j;
    system( "cls" );
    if( i != 0 )
    {
        cout << "\n\n\n";
        for( j = 0; j < i; j++ )
        {
            cout << "~~~~~~~~~~~~~~Wyswietlam wprowadzone dane~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
            cout << "x     Podaj numer jednosladu aby wyswietlic dane o nim " << j + 1 << ": \n";
            cout << "x     Marka motocykla: " << dane[ j ].marka << "\n";
            cout << "x    Model motocykla: " << dane[ j ].model << "\n";
            cout << "x     pojemnosc motocykla: " << dane[ j ].pojemnosc << "\n";
            cout << "x     Rocznik motocykla: " << dane[ j ].rok << "\n";
            cout << "x     przebieg motocykla: " << dane[ j ].przebieg << "\n";
            cout << "x     cena motocykla: " << dane[ j ].cena << "\n";
            cout << "x";
            cout << "~~~~~~~~~~~~To wszystkie dane na temat wybranego przez Ciebie pojazdu~~~~~~~~~~~~~~" << endl;
        }
    }
    else
         cout << "\n\nNie ma zadanego motocykla w bazie\n\n\t\t";
   
    system( "pause" );
}

/*Funkcja umozliwia zmiane zawartosci wybranego rekordu*/

void Edytuj()
{
   
    int nr;
    if( i != 0 )
    {
        system( "cls" );
        cout << "\n\n\t\tPodaj numer motocykla, ktory chcesz edytowac: ";
        cin >> nr;
        nr = nr - 1;
        cin.ignore();
       
        if( nr < 0 || nr > i )
        {
            system( "cls" );
            cout << "\n\n\t\tNie mozna wykonac operacji - brak danych\n\n\t\t";
            system( "pause" );
        }
        else
        {
            system( "cls" );
            cout << "\n\n\t\tPodaj marke motocykla:";
            cin >> dane[ nr ].marka;
            cout << "\n\n\t\tPodaj model motocykla:";
            cin >> dane[ nr ].model;
            cout << "\n\n\t\tpodaj pojemnosc motocykla:";
            cin >> dane[ nr ].pojemnosc;
            cout << "\n\n\t\tPodaj rocznik motocykla: \n";
            cin >> dane[ nr ].rok;
            cout << "\n\n\t\tPodaj przebieg motocykla: \n";
            cin >> dane[ nr ].przebieg;
            cout << "\n\n\t\tPodaj cene motocykla: \n";
            cin >> dane[ nr ].cena;
            cout << "\n\n\t\tMotocykl " << nr + 1 << " został zmieniony!\n\n\t\t";
            cin.ignore();
            getchar();
            Zapisz();
        }
    }
    else
    {
        system( "cls" );
        cout << "\n\n\t\t Nie ma pojazdow w bazie. Nacisnij dowolny klawisz";
        system( "pause" );
    }
}

void Usun()
{
    int nr;
    cout << "\n\n\t  Podaj numer pojazdu, ktorego chcesz usunac: ";
    cin >> nr;
    nr = nr - 1;
    cin.ignore();
   
    if( i != 0 )
    {
        if( nr > i )
        {
            cout << "\n\n\t\t Operacja nie moze byc wykonana brak motocykla o takim numerze";
            getchar();
        }
        else
        {
            for( short w = nr; w < i; w++ )
            {
                dane[ w - 1 ].marka = dane[ w ].marka;
                dane[ w - 1 ].model = dane[ w ].model;
                dane[ w - 1 ].pojemnosc = dane[ w ].pojemnosc;
                dane[ w - 1 ].rok = dane[ w ].rok;
                dane[ w - 1 ].przebieg = dane[ w ].przebieg;
                dane[ w - 1 ].cena = dane[ w ].cena;
            }
            i--;
           
            system( "cls" );
            cout << "\n\n\tPojazd o numerze " << nr << " zostal usuniety";
            getchar();
            Zapisz();
        }
    }
    else
    {
        cout << "\n\n\t\tNie ma pojazd w bazie. Wcisnij ENTER aby zamknac!";
        getchar();
    }
}


plik pojazdy.txt:


BMW
G 650
652
2011
5 651
21 500
BMW
GS
1001
2012
12900
65 900
HARLEY-DAVIDSON
FAT BOY
1001
1999
43000
32 400
SUZUKI
GLADIUS
645
2010
15400
16 900
SUZUKI
HAYABUSA
1340
2013
12000
42900
TRIUMPH
SPEED TRIPLE
1050
2011
21000
33800
TRIUMPH
TIGER EXPLORER XC
1215
2014
3300
60 400
YAMAHA
YZ 250F
250
2009
2020
12900
KTM
SX
450
2006
32 800
8 200
KAWASAKI
Z800
800
2014
1430
31900
SUZUKI
GSR 600
600
2006
1795
19400
KAWASAKI
ZZR
1400
2011
6500
35000
KTM
DUKE 690
654
2008
9500
17799
YAMAHA
R1
1000
2005
13000
16900
YAMAHA
FJR
1300
2009
6800
41 900
YAMAHA              
XVS STRYKER
1300
2011
1200
29000
SUZUKI
GS 500

500
1993
42000
3099
HONDA
CBR 600
600
1999
39345
7 900
YAMAHA
DT
51
1999
54000
4000
DUCATI
MONSTER 696
696
2011
5800
22000
[/i]
P-107376
OczkoSX
» 2014-03-29 13:27:00
Kod podajemy w znacznikach ["cpp"] ["/cpp"]
P-107392
colorgreen19
» 2014-03-29 15:25:01
w funkcji wczytaj() masz cos takiego:
C/C++
ifstream plik( "pojazdy.txt", ios::in );
plik >> i;
jak wczesniej deklarowales i to zmienna globalna tylu
int
 Jezeli dane w pliku sa dokladnie tak jak podales to probojesz pobrac liczbe z 1 lini pliku, jednak tam stoi napis BMW. Wnioskujac strumien ustwaia ci flage bledu i odmawia dalszej wspolpracy.
P-107406
Spiritualself
Temat założony przez niniejszego użytkownika
» 2014-03-29 16:49:35
ZmieniłAm więc wyrzucanie pliku
C/C++
fstream plik;

if( z == 1 )
{
    char tekst[ 100 ];
    fstream plik( "pojazdy.txt", ios::in | ios::out | ios::ate );
    plik.close();
   
    plik.open( "pojazdy.txt" );
    while( !plik.eof() ) {
        plik.getline( tekst, 100 );
        cout << tekst << endl;
    }
    plik.close();
   
    system( "PAUSE" );
    EXIT_SUCCESS;
   
    if( !plik )
    {
        cerr << "\n Blad odczytu/brak znalezionego pliku. Program zostanie zatrzymany" << endl;
        system( "pause" );
        return 0;
    }
 (dziękuje OczkoSX za zwrócenie uwagi)

Mam tylko problem z tym, że po wczytaniu pliku wyskakują jego dane a po naciśnięciu klawisza program nie zamyka się lecz wyskakuje komunikat "Blad odczytu/brak znalezionego pliku[...]".  Nie wiem jak to zmienić, gdyż po usunięciu wyskakują dwa błędy typu "cout does not name a type" czy "expected unqualified-id before do".
P-107414
colorgreen19
» 2014-03-29 17:23:02
przepraszam za nie zwrócenie uwagi na plec, nieprzespana noc i troche mam "oczopląs"...

"Przelećmy" sobie wzrokiem kod.
otwierasz plik konstruktorem, po czym odrazu go zamykasz // niepotrzebne jest to zamkniecie i ponowne otworzenie strumienia //

wczytujesz to tablicy char linijki z pliku dopóki nie bedzie jego konca,// w petli równiez wyświetlasz zawartość tego pliku

zamykasz strumien (czyli konczysz prace) pliku

pause'ujesz konsole, zwracasz zakonczenie programu.  Jest to teoretycznie koniec programu i nie powinno sie dalej nic robic, jednak to jest c++ i sie robi (też nie wiem dlaczego ;]). Co się robi?

Mianowicie sprawdzasz czy strumien z pliku jest (chyba,//przepraszam nie pamietam//) otwarty i jest bez błędu. Skoro zamknełaś strumien 5 linijek wczensiej to zwraca false, czyli wyswietla ci twoj napisany (tego
cerr
a) błąd. //konsola sie ponownie pause'uje i jest znowu zwracany koniec programu.

Jeżeli chcesz, aby sie wyłączał od razu (jak zrozumiałem) to usuń linijke system("PAUSE").

Jeżeli chcesz aby ten warunek "naprawde" działał musisz go umieśćic tuż po otwarciu pliku, a przed wczytywaniem danych (nobo mogą być uszkodzone albo coś...)
P-107417
Spiritualself
Temat założony przez niniejszego użytkownika
» 2014-03-29 18:06:31
Dziękuję ślicznie za pomoc, Colorgreen19 :)
P-107421
« 1 »
  Strona 1 z 1