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

[Kurs C++, XX.] Ćw. 2

Ostatnio zmodyfikowano 2009-08-27 10:51
Autor Wiadomość
Micah
Temat założony przez niniejszego użytkownika
[Kurs C++, XX.] Ćw. 2
» 2009-08-26 19:27:43
Program DEV-C++ podczas kompilacji wyrzuca mi pewne błędy. Nie znam się jeszcze na C++ zbyt dobrze, więc nie wiem, o co chodzi z tymi błędami. Oto log kompilacji (niestety, zapomniałem, jak się daje tekst w cytacie, więc z góry przepraszam za "prostotę"):
Kompilator: Default compiler
Building Makefile: "D:\Moje dokumenty\Folder roboczy\Projekty\C++\Makefile.win"
Wykonywanie  make...
make.exe -f "D:\Moje dokumenty\Folder roboczy\Projekty\C++\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"  

main.cpp: In function `int main()':
main.cpp:17: error: `struct std::ios::base' has not been declared

main.cpp:30: error: `struct std::ios::base' has not been declared
main.cpp:30: error: `out' undeclared (first use this function)
main.cpp:30: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp:34: error: `linia' undeclared (first use this function)

main.cpp: In function `int Odczyt(const std::string&, std::string)':
main.cpp:46: error: `struct std::ios::base' has not been declared
main.cpp:49: error: expected init-declarator before '-' token
main.cpp:49: error: expected `,' or `;' before '-' token
main.cpp:51: error: declaration of 'std::string linia' shadows a parameter

main.cpp:65: error: invalid use of member (did you forget the `&' ?)

main.cpp:76: error: expected `(' before "linia"
main.cpp:85: error: expected `(' before "linia"
main.cpp:91: error: `linial' undeclared (first use this function)
main.cpp:92: error: `ostatni' undeclared (first use this function)
main.cpp:97: error: `non' undeclared (first use this function)
main.cpp:97: error: `cookie' undeclared (first use this function)
main.cpp:101: error: expected `(' before "linia"
main.cpp:107: error: expected primary-expression before "else"
main.cpp:107: error: expected `;' before "else"
main.cpp:114: error: a function-definition is not allowed here before '{' token

main.cpp:114: error: expected `,' or `;' before '{' token
main.cpp:124: error: a function-definition is not allowed here before '{' token
main.cpp:124: error: expected `,' or `;' before '{' token
main.cpp:152: error: expected `}' at end of input
main.cpp:152: error: expected `}' at end of input
make.exe: *** [main.o] Error 1
Wykonanie zakończone


A to kod programu:
C/C++
#include <iostream>
#include <conio.h>
#include <sstream>
#include <fstream>

using namespace std;


int Odczyt( const string & nazwa );
int Przerobka( int zalogowani, int zarejestrowani, int wszyscy );
void Zapis( const string & nazwa );



int main()
{
    using std::ios::base;
   
    using std::string;
    const string nazwa = "dane.txt";
   
    Odczyt( nazwa );
   
    int zal, zar, wsz;
   
    Przerobka( zal, zar, wsz );
    Zapis( nazwa );
   
    fstream plik;
    plik.open( nazwa.c_str(), ios::base::out );
   
    while( !plik.eof() )
    {
        getline( plik, linia );
        cout << linia << endl;
    }
   
    getch();
    return( 0 );
}


//odczyt z pliku
int Odczyt( const string & nazwa, string linia )
{
    using std::ios::base;
    using std::string;
   
    string aktywni, ostatnie, non - cookie;
   
    string linia;
    bool good();
    fstream plik;
   
    plik.open( nazwa.c_str(), ios_base::in );
   
    while( !plik.eof() )
    {
        getline( plik, linia );
       
       
       
       
        //otwarcie pliku - pomyślne
        if( plik.open = good() )
        {
            while( !plik.eof() )
            {
                //czytanie "aktywnych"
                getline( plik, linia );
                aktywni = linia;
               
                //czytanie "zalogowanych"
                getline( plik, linia );
               
                if linia.find( digit )
                if linia.find( digit )
                {
                    sscanf( linia.c_str(), "%d", & zalogowani );
                }
               
               
                //czytanie "zarejestrowanych"
                getline( plik, linia );
                if linia.find( digit )
                {
                    sscanf( linia.c_str(), "%d", & zarejestrowani );
                }
               
                //czytanie "ostatnich"
                getline( plik, linial );
                ostatni = linia;
               
                //czytanie "non-cookie"
               
                getline( plik, linial );
                non - cookie = linia;
               
                //czytanie "wszystkich"
                getline( plik, linial );
                if linia.find( digit )
                {
                    sscanf( linia.c_str(), "%d", & wszyscy );
                }
            }
           
            else cout << "Nie udalo sie otworzyc pliku!";
           
            return( 0 );
        }
       
        //przeróbka pobranych danych
        int Przerobka( int zalogowani, int zarejestrowani, int wszyscy )
        {
            zarejestrowani = zarejestrowani + 2;
            wszyscy = wszyscy - zalogowani;
            plik.close();
           
            return( 0 );
        }
       
        //zapis nowych danych do pliku
        void Zapis( const string & nazwa )
        {
            using std::iosbase;
            using std::string;
            std::stringstream IntToStr;
           
            int pozycja;
            string bufor;
           
            IntToStr >> zalogowani;
            IntToStr >> zarejestrowani;
            IntToStr >> wszyscy;
           
            fstream plik.open( nazwa.c_str(), ios_base::out );
           
            //czytanie linii i zapisywanie nowej
            getline( plik, bufor );
           
           
            plik << "Obecnie aktywnych: " <<& aktywni << endl
            << "Zalogowanych: " << zalogowani << endl
            << "Zarejestrowanych: " << zarejestrowani << endl
            << "Ostatnie 24h: " << ostatnie << endl
            << "Non-cookie 24h: " << non - cookie << endl
            << "Wszystkich: " << wszyscy;
           
            plik.close();
           
            return( 0 );
        }
Bardzo chciałbym prosić Was o pomoc w znalezieniu źródła tych błędów. Z góry dziękuję.

P.S.: Tylko się zagłębić w trudniejsze sprawy i już głowa odpada. A nie chciałem przerabiać żywcem skopiowanego kodu z lekcji, bo wolałem napisać program od podstaw.
Proszę o usunięcie tej kopii tematu.
P-9885
malan
» 2009-08-26 20:30:50
No trochę tych błędów narobiłeś:

1. Jeśli zastosowałeś zapis using namespace std przed mainem to w dalszej części programu nie musisz już używać std::.

2.
C/C++
using std::ios::base; //1
using std::string;
Co tu robi using ? Moim zdanie on tu być nie powinien. Przecież w nagłówku masz już using namespace std.
//1 Tego zapisu używa się np. w funkcji, która otwiera plik. To tu raczej nie potrzebne. Poza tym jest on błędny.

3.
plik.open( nazwa.c_str(), ios::base::out );
ios::base::out ? hmm... ios::out chyba :).

4.
C/C++
int Odczyt( const string & nazwa );
void Zapis( const string & nazwa );
Skoro przed zmienną dodałeś const to ona i tak się nie zmieni, więc nie wiem po co referencja (&).

No to mniej więcej wszystko. Podsumowując- przeczytaj kurs raz jeszcze :).
P-9890
GoldWolf
» 2009-08-26 20:38:29
Jeśli zastosowałeś zapis using namespace std przed mainem to w dalszej części programu nie musisz już używać std::.Nie jest to dobra technika, ale na razie w kursie nie ma nic jak sobie z tym poradzić.
P-9892
malan
» 2009-08-26 23:28:40
ten_zuy jak zaczynałeś programować to wszystko od razu wiedziałeś ? ;>. Nie wiedziałem, że to kopiowanie zajmuje aż tyle czasu... No, ale człowiek uczy się całe życie :).
P-9901
Micah
Temat założony przez niniejszego użytkownika
» 2009-08-27 10:22:42
Uprościłem trochę metodę działania programu, aby lepiej zrozumieć kod. Poza tym udało mi się naprawić parę błędów. Oto nowy kod :

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


using namespace std;


int Odczyt( const string nazwa );
int Przerobka( int zalogowani, int zarejestrowani, int wszyscy );
void Zapis( const string nazwa );



int main()
{
   
    const string nazwa = "dane.txt";
    string linia;
   
    string aktywni;
    string noncookie;
    string ostatnie;
    int zalogowani, zarejestrowani, wszyscy;
   
    Odczyt( nazwa );
   
    int zal, zar, wsz;
   
    Przerobka( zal, zar, wsz );
    Zapis( nazwa );
   
    cout << "Obecnie aktywnych: " << aktywni << endl
    << "Zalogowanych: " << zalogowani << endl
    << "Zarejestrowanych: " << zarejestrowani << endl
    << "Ostatnie 24h: " << ostatnie << endl
    << "Non-cookie 24h: " << noncookie << endl
    << "Wszystkich: " << wszyscy;
   
    getch();
    return( 0 );
}


//odczyt z pliku
int Odczyt( const string & nazwa )
{
   
    string linial;
   
    string aktywni;
    string ostatnie;
    string noncookie;
   
    int & zalogowani, & zarejestrowani, & wszyscy;
   
    bool good();
    fstream plik;
   
    plik.open( nazwa.c_str(), ios::in );
   
    while( !plik.eof() )
    {
       
       
       
       
        //czytanie "aktywnych"
        getline( plik, linial );
        & aktywni = linial;
       
        //czytanie "zalogowanych"
        getline( plik, linial );
        sscanf( linial.c_str(), "%d", & zalogowani );
       
       
       
        //czytanie "zarejestrowanych"
        getline( plik, linial );
        sscanf( linial.c_str(), "%d", & zarejestrowani );
       
       
        //czytanie "ostatnich"
        getline( plik, linial );
        & ostatnie = linial;
       
        //czytanie "non-cookie"
       
        getline( plik, linial );
        & noncookie = linial;
       
        //czytanie "wszystkich"
        getline( plik, linial );
        sscanf( linial.c_str(), "%d", & wszyscy );
       
       
       
        return( 0 );
    }
   
    //przeróbka pobranych danych
    int Przerobka( int zalogowani, int zarejestrowani, int wszyscy );
    {
        zarejestrowani = zarejestrowani + 2;
        wszyscy = wszyscy - zalogowani;
        plik.close();
       
        return( 0 );
    }
   
    //zapis nowych danych do pliku
    void Zapis( const string nazwa );
    {
        using std::iosbase;
       
        std::stringstream IntToStr;
       
        int pozycja;
        string bufor;
       
        IntToStr >> zalogowani;
        IntToStr >> zarejestrowani;
        IntToStr >> wszyscy;
       
        fstream plik;
        plik.open( nazwa.c_str(), ios::out );
       
        //czytanie linii i zapisywanie nowej
        getline( plik, bufor );
       
       
        plik <<& aktywni << endl
        <<& zalogowani << endl
        <<& zarejestrowani << endl
        <<& ostatnie << endl
        <<& noncookie << endl
        <<& wszyscy;
       
        plik.close();
       
        return( 0 );
    } }


Ale wyskoczyły mi nowe błędy, np. że nie zainicjowałem pewnych zmiennych. Tylko jak to zrobić?  Oto log kompilacji :

Kompilator: Default compiler
Building Makefile: "D:\Moje dokumenty\Folder roboczy\Projekty\C++\Makefile.win"
Wykonywanie  make...
make.exe -f "D:\Moje dokumenty\Folder roboczy\Projekty\C++\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"  

main.cpp: In function `int Odczyt(const std::string&)':
main.cpp:56: error: `zalogowani' declared as reference but not initialized
main.cpp:56: error: `zarejestrowani' declared as reference but not initialized
main.cpp:56: error: `wszyscy' declared as reference but not initialized
main.cpp:71: error: non-lvalue in assignment
main.cpp:86: error: non-lvalue in assignment
main.cpp:91: error: non-lvalue in assignment
main.cpp:115: error: `std::iosbase' has not been declared

make.exe: *** [main.o] Error 1

Wykonanie zakończone

Nie wiem, jak to naprawić.
P-9907
Micah
Temat założony przez niniejszego użytkownika
» 2009-08-27 16:48:00
Zacząłem program od nowa, tyle że najpierw rozpisałem sobie wszystko w głównej funkcji, a dopiero potem poprzenosiłem do funkcji. Na razie jednak nie brałem się za ".find()". Niestety parę razy zadeklarowałem zmienną plikową, co pewnie przeciążyło nieco program. Oto nowy kod:

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

using namespace std;

void Odczyt( const string & nazwa, string linia );
int Zmiana( int & zalogowani, int & zarejestrowani, int & wszyscy );
void Zapis( const string & nazwa, string & bufor, int & zarejestrowani, int & wszyscy );



int main()
{
    using std::ios_base;
   
   
    const string nazwa = "dane.txt";
   
    string linio;
   
    Odczyt( nazwa, linio );
   
    int zal, zar, wsz;
    Zmiana( zal, zar, wsz );
   
    string bufek;
    Zapis( nazwa, bufek, zar, wsz );
   
    //wyświetlenei zmienionego pliku w konsoli;     
    fstream plikus;
    plikus.open( nazwa.c_str(), ios::in );
   
    while( !plikus.eof() )
    {
        getline( plikus, linio );
        cout << linio;
    }
   
    //zakończenie programu
    getch();
    return( 0 );
}

//odczyt z pliku
void Odczyt( const string & nazwa, string linia )
{
    fstream plik;
    plik.open( nazwa.c_str(), ios::in );
   
    string bufor[ 6 ]; //czytanie zalogowanych
    for( short i = 1; i <= 2; i++ )
    {
        getline( plik, linia );
        bufor[ i ] = linia;
       
    }
   
    int zalogowani;
    sscanf( linia.c_str(), "%d", zalogowani );
   
    getline( plik, linia ); //czytanie zarejestrowanych
    bufor[ 3 ] = linia;
   
   
    int zarejestrowani;
    sscanf( linia.c_str(), "%d", zarejestrowani );
   
    for( short i = 1; i <= 3; i++ ) //czytanie wszystkich
    {
        getline( plik, linia );
        bufor[ i + 3 ] = linia;
       
    }
    int wszyscy;
    sscanf( linia.c_str(), "%d", wszyscy );
   
   
   
    return( plik.close() );
}

//przypisywanie zmiennym nowych wartości
int Zmiana( int & zalogowani, int & zarejestrowani, int & wszyscy )
{
    zarejestrowani += 2;
    wszyscy -= zalogowani;
   
    return( 0 );
}

//zapis zmodyfikowanych danych do pliku
void Zapis( const string & nazwa, string & bufor, int & zarejestrowani, int & wszyscy )
{
    stringstream IntToStr;
   
    IntToStr >> zarejestrowani;
    IntToStr >> wszyscy;
   
    bufor[ 3 ] = zarejestrowani;
    bufor[ 6 ] = wszyscy;
   
    fstream plik;
    plik.open( nazwa.c_str(), ios::out );
   
    for( short i = 1; i <= 6; i++ )
         plik << bufor[ i ] << endl;
   
    return( plik.close() );
}

Jednak kiedy uruchamiam ten program, to pokazuje mi się raport o błędzie i zamyka program, a w pliku *.txt nic się nie zmienia. Screenshot (z góry przepraszam, jeżeli naruszę jakąś zasadę co do miniatur):

http://img216.imageshack.us/img216/7355/zrzuto.jpg


Tu jest plik "dane.txt" potrzebny do działania programu :
http://www.space-nation.eu/?d=19F22E111 .

Czy u Was również są takie dziwne sytuacje po skompilowaniu tego programu ?


Znowu kiedy kompiluję przykład z wyżej wymienionej lekcji, to program uruchamia się na sekundę, a potem się zamyka i również nie ma żadnych zmian w pliku "mojplik.txt". Jeszcze wcześniej po skompilowaniu tego przykładu równiez pojawiał się raport o błędzie.

Jak myślicie, skąd te raporty o błędach i brak jakiegokolwiek widocznego działania ze strony programu ? Pytam się o to, bo może kompilator DEV-C++ nie kompiluje prawidłowo pewnych operacji, przez co "psuje" program. A może wina jest w czymś innym...

P.S.: Program napisany jest trochę na szybko, więc nie ma wypisania tekstów z "Panelu Logowania", takich jak "Obecnie aktywnych: ", itd. Może dopiszę je jeszcze później.



//:: Popraw adres do screen'a, bo wyskakuje 404.


Edit:

W moim programie dodałem  w głównej funkcji przed "getch();" polecenie "plikus.close();" (zapomniałem, że przecież trzeba zamknąć plik po skończeniu operacji).
Miałem po drodze jeszcze jeden bład, ale go naprawiłem, usuwając kompresję in'ów string'i, ale pprzedni błąd znów się pojawił. Oto nowy kod :

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

using namespace std;

void Odczyt( const string & nazwa, string linia );
int Zmiana( int & zalogowani, int & zarejestrowani, int & wszyscy );
void Zapis( const string & nazwa, string & bufor, int & zarejestrowani, int & wszyscy );



int main()
{
    using std::ios_base;
   
   
    const string nazwa = "dane.txt";
   
    string linio;
   
    Odczyt( nazwa, linio );
   
    int zal, zar, wsz;
    Zmiana( zal, zar, wsz );
   
    string bufek;
    Zapis( nazwa, bufek, zar, wsz );
   
    //wyświetlenie zmienionego pliku w konsoli;     
    fstream plikus;
    plikus.open( nazwa.c_str(), ios::in );
   
   
    //wyświetlanie danych w konsoli
    getline( plikus, linio ); //aktywni
    cout << "Obecnie aktywnych: " << linio << endl;
   
    getline( plikus, linio ); //zalogowani
    cout << "Zalogowanych: " << linio << endl;
   
    getline( plikus, linio ); //zarejestrowani
    cout << "Zarejestrowanych: " << linio << endl;
   
    getline( plikus, linio ); //ostatnie 24h
    cout << "Ostatnie 24h: " << linio << endl;
   
    getline( plikus, linio ); //non-cookie
    cout << "Non-cookie 24h: " << linio << endl;
   
    getline( plikus, linio ); //wszyscy
    cout << "Wszystkich: " << linio << endl;
   
    plikus.close();
   
    //zakończenie programu
    getch();
    return( 0 );
}

//odczyt z pliku
void Odczyt( const string & nazwa, string linia )
{
    fstream plik;
    plik.open( nazwa.c_str(), ios::in );
   
    string bufor[ 6 ]; //czytanie zalogowanych
    for( short i = 1; i <= 2; i++ )
    {
        getline( plik, linia );
        bufor[ i ] = linia;
       
    }
   
    int zalogowani;
    sscanf( linia.c_str(), "%d", zalogowani );
   
   
    getline( plik, linia ); //czytanie zarejestrowanych
    bufor[ 3 ] = linia;
   
   
    int zarejestrowani;
    sscanf( linia.c_str(), "%d", zarejestrowani );
   
    for( short i = 1; i <= 3; i++ ) //czytanie wszystkich
    {
        getline( plik, linia );
        bufor[ i + 3 ] = linia;
       
    }
    int wszyscy;
    sscanf( linia.c_str(), "%d", wszyscy );
   
   
   
    return( plik.close() );
}

//przypisywanie zmiennym nowych wartości
int Zmiana( int & zalogowani, int & zarejestrowani, int & wszyscy )
{
    zarejestrowani += 2;
    wszyscy -= zalogowani;
   
    return( 0 );
}

//zapis zmodyfikowanych danych do pliku
void Zapis( const string & nazwa, string & bufor, int & zarejestrowani, int & wszyscy )
{
   
   
    bufor[ 3 ] = zarejestrowani;
    bufor[ 6 ] = wszyscy;
   
    fstream plik;
    plik.open( nazwa.c_str(), ios::out );
   
    for( short i = 1; i <= 6; i++ )
    {
        if(( i != 3 ) &( i != 6 ) )
             plik << bufor[ i ] << endl;
        else if( i = 3 ) plik << zarejestrowani << endl;
        else if( i = 6 ) plik << wszyscy << endl;
       
    }
    return( plik.close() );
}

Będę wdzięczny za wszelkie uwagi.
P-9912
GoldWolf
» 2009-08-28 22:11:10
Przede wszystkim program, nadal nie działa, pojawiają się błędy.

Po drugie powinieneś już sam starać sobie tworzyć własne zabezpieczenia. Jeżeli nie ma pliku dane.txt to warto by było napisać, że go nie ma i zakończyć działanie programu. Inaczej mówiąc brak mechanizmów bezpieczeństwa.

To Ty powinieneś wskazać gdzie jest błąd, to ćwiczenia bardzo łatwo pokazuje gdzie masz braki. Napisałeś program ale to za mało. Nie wystarczy skalkować rozwiązania.

Źle napisane jest funkcja -> void Odczyt(const string &nazwa,string linia);.

Uważam, że nie opanowałeś dobrze tematu. Funkcje nie zając nie uciekną. Spróbuj spokojnie napisać jeszcze raz zadanie lub cofnąć się o kilka kursów i przerobić ponownie.
P-9929
DejaVu
» 2009-08-28 23:04:23
Dante wie co mówi - on pisał do tych lekcji kursy i aktualizował ich treść.
P-9931
« 1 » 2
  Strona 1 z 2 Następna strona