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

20.1 Referencje

Ostatnio zmodyfikowano 2010-09-16 00:16
Autor Wiadomość
Pirous
Temat założony przez niniejszego użytkownika
20.1 Referencje
» 2010-09-15 21:12:49
Analizowałem podany tam przykład kilkakrotnie i nadal nie mam pojęcia, jak ten program może zapisywać jakiekolwiek dane do pliku. Czy mógłby ktoś wyjaśnić mi łopatologicznie jak dzieje się to, że zmienna danepliku przybiera jakąś wartość i ta wartość jest następnie zapisywana?

Tutaj kod:
C/C++
//Funkcje z parametrami referencyjnymi-------
#include <conio.h>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream> //nowa biblioteka
void OdczytPliku( const std::string & nazwapliku, std::string & bufor );
void Algorytm( std::string & bufor, short & zmienna, int & Wynik );
void ZapisPliku( const std::string & nazwapliku, const std::string & bufor );
std::string PL( std::string & znak );

int main()
{
    using std::string;
    using std::cout;
    const string NAZWAPLIKU = "mojplik.txt";
    string danepliku;
    short x = 0;
    int wynik = 0;
   
    OdczytPliku( NAZWAPLIKU, danepliku );
    Algorytm( danepliku, x, wynik );
    ZapisPliku( NAZWAPLIKU, danepliku );
    cout << PL( danepliku );
   
    getch();
    return 0;
}
//odczytuje dana z pliku
void OdczytPliku( const std::string & nazwapliku, std::string & bufor ) {
    using std::fstream;
    fstream plik;
    std::string bufor1;
   
    plik.open( nazwapliku.c_str(), std::ios::in );
    if( plik.is_open() ) {
        while( !plik.eof() ) {
            getline( plik, bufor1 );
            bufor1 += "\n";
            bufor += bufor1;
        }
    } else
         std::cout << "Brak mojego pliku !";
   
}
//funkcja pobiera dane z wcześniej wczytanego pliku i modyfikuje je wg prostego wzoru
void Algorytm( std::string & bufor, short & zmienna, int & Wynik ) {
    short pozycja, pozycja1;
    std::string bufor1;
    std::stringstream IntToStr;
   
    if( bufor.find( 'ż' ) ) {
        //zapisuje pozycje literki ż
        pozycja = bufor.find( 'ż' );
        // przesuwamy pozycje o 2
        pozycja += 2;
        //wycinamy z całego buforu 10 pozycji od pozycji
        bufor1.assign( bufor, pozycja, 10 );
        if( bufor1.find( ' ' ) ) {
            //zapisuje pozycje spacji
            pozycja1 = bufor1.find( ' ' );
            //następnie zostawiamy tylko liczbę
            bufor1.assign( bufor1, 0, pozycja1 );
            //zamieniamy stringa na inta
            sscanf( bufor1.c_str(), "%d", & zmienna );
            //wykonujemy działanie
            Wynik = 2 * ++zmienna + 15;
            //zamieniamy inta na stringa
            IntToStr << zmienna;
            IntToStr >> bufor1;
            IntToStr.clear(); // zerowanie IntToStr
            //zastępujemy liczbą jaka była w buforze liczbą o 1 większą
            bufor.replace( pozycja, pozycja1, bufor1 );
            //tan if ma słyżyć też zastąpienu tylko drugiego wystąpienia liczby czyli w wyrażeniu 2 * liczba + 15
            if( bufor.find( "funkcja" ) ) {
                pozycja = bufor.find( '2', bufor.find( "funkcja" ) );
                bufor.replace( pozycja + 4, pozycja1, bufor1 );
            }
            //pozostaje jeszcze zmienić wynik na wyżej obliczony
            if( bufor.find( "k to " ) ) {
                pozycja = bufor.find( ' ', bufor.find( "k to " ) );
                //ponownie IntToString
                IntToStr << Wynik;
                IntToStr >> bufor1;
                bufor.replace(( pozycja + 4 ), bufor1.length(), bufor1 );
            }
            //       std::cout << bufor;
           
        }
        if( bufor.find( "!" ) )
        if( bufor.find( "." ) ) {
        }
    } else
         std::cout << "Brak szukanej litery!";
   
}
//zapisuje dane do pliku mojplik
void ZapisPliku( const std::string & nazwapliku, const std::string & bufor ) {
    using std::fstream;
    fstream plik;
   
    plik.open( nazwapliku.c_str(), std::ios::out );
    if( plik.is_open() ) {
        plik << bufor;
    } else
         std::cout << "Brak mojego pliku !";
   
}
//poprawnie wyswietla polskie znaki w konsoli
std::string PL( std::string & znak ) {
   
    for( unsigned i = 0; i < znak.length(); i++ ) {
        switch( znak[ i ] ) {
        case 'ą':
            znak[ i ] = static_cast < char >( 165 );
            break;
           
        case 'ć':
            znak[ i ] = static_cast < char >( 134 );
            break;
           
        case 'ę':
            znak[ i ] = static_cast < char >( 169 );
            break;
           
        case 'ł':
            znak[ i ] = static_cast < char >( 136 );
            break;
           
        case 'ń':
            znak[ i ] = static_cast < char >( 228 );
            break;
           
        case 'ó':
            znak[ i ] = static_cast < char >( 162 );
            break;
           
        case 'ś':
            znak[ i ] = static_cast < char >( 152 );
            break;
           
        case 'ź':
            znak[ i ] = static_cast < char >( 171 );
            break;
           
        case 'ż':
            znak[ i ] = static_cast < char >( 190 );
            break;
           
        case 'Ą':
            znak[ i ] = static_cast < char >( 164 );
            break;
           
        case 'Ć':
            znak[ i ] = static_cast < char >( 143 );
            break;
           
        case 'Ę':
            znak[ i ] = static_cast < char >( 168 );
            break;
           
        case 'Ł':
            znak[ i ] = static_cast < char >( 157 );
            break;
           
        case 'Ń':
            znak[ i ] = static_cast < char >( 227 );
            break;
           
        case 'Ó':
            znak[ i ] = static_cast < char >( 224 );
            break;
           
        case 'Ś':
            znak[ i ] = static_cast < char >( 151 );
            break;
           
        case 'Ź':
            znak[ i ] = static_cast < char >( 141 );
            break;
           
        case 'Ż':
            znak[ i ] = static_cast < char >( 189 );
            break;
        }
    }
    return znak;
}
P-22008
SeaMonster131
» 2010-09-15 21:18:50
otaguj kod [ code src="C++" ] ... [ /code ] (bez spacji) - bo czytać sie nie da...
P-22009
ison
» 2010-09-15 21:28:43
wszystko co robisz z referencją zmiennej dzieje się również z nią samą
przykładowo, jeśli chcesz napisać funkcję inkrementującą zmienną typu int:
C/C++
#include <cstdio>

void inc( int & liczba )
{
    ++liczba; //nie musisz nic zwracać, wszystkie operacje na 'liczba' zmieniają wartość zmiennej podanej w argumencie
}

int main()
{
    int zmienna = 5;
    inc( zmienna );
    printf( "Teraz zmienna wynosi: %d!\r\n", zmienna );
}
P-22010
Pirous
Temat założony przez niniejszego użytkownika
» 2010-09-15 21:34:28
Aha, rozumiem. Dziękuję.
P-22012
DejaVu
» 2010-09-15 22:08:56
Na przyszłość zrobiłem krótkiego arta. [C++] Jak działa referencja w funkcjach?
P-22016
ison
» 2010-09-15 22:25:41
warto by jeszcze dopisać o praktycznym zastosowaniu referencji takim jak funkcja swap'ująca dwie zmienne oraz o zwracaniu referencji przez funkcję
P-22018
DejaVu
» 2010-09-16 00:16:01
Jak masz propozycję rozwoju treści to napisz ją tu :) ja potem ją przekopiuję, trochę poprawię i dopiszę Ciebie do autorów ;p

/edit:
Pamiętaj, aby treść była banalna, a nie wyczerpywała temat, bowiem to mają być pomoce naukowe, a nie encyklopedia o danym problemie.

/edit2:
Nie sądzę, aby początkujący używał zmiennych zwracanych przez referencję. Prędzej krzywdę się zrobi takiemu czytelnikowi mówiąc o tym na dzień dobry, aniżeli przyniesie korzyści.
P-22023
« 1 »
  Strona 1 z 1