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

Plik do odczytu i zapisu jednocześnie(globalnie) ~ kłopot z zapisem.

Ostatnio zmodyfikowano 2014-01-20 23:14
Autor Wiadomość
mgrD
Temat założony przez niniejszego użytkownika
Plik do odczytu i zapisu jednocześnie(globalnie) ~ kłopot z zapisem.
» 2014-01-20 12:01:20
Witam, chciałbym zapytać czy istnieje opcja otworzenie pliku do zapisu i odczytu jednocześnie(będę w pętli raz zapisywał wyraz a raz odczytywał) -> Teoretycznie wiem, że otwarcie pliku w trybie out and in da mi żądany efekt, lecz otwieram plik w głównej funkcji programu(main) a czytam plik we własnej funkcji.
Przykład:
C/C++
int main()
{
    std::fstream plik( "liczby.txt", std::ios::out | std::ios::in );
    //....
}

bool sprawdz( int in )
{
    for( int p = 0; p < in; p++ )
    {
        if( tekscik[ p ] == tekscik[ in ] ) return 1;
       
    }
   
    while( std::getline( plik, str ) )
    {
        found = str.find( tekscik[ in ] );
        if( found == std::string::npos )
        {
            return 1;
            break;
        }
    }
    return 0;
}

Co oznacza, że w pętli while dostaje błąd:

\main.cpp||In function 'bool sprawdz(int)':|
\main.cpp|63|error: 'plik' was not declared in this scope|
\main.cpp|66|warning: comparison between signed and unsigned integer expressions [-Wsign-compare]|
||=== Build finished: 1 errors, 2 warnings (0 minutes, 0 seconds) ===|

Próbowałem dać
std::fstream plik( "liczby.txt", std::ios::out | std::ios::in );
przed funkcją main lecz wtedy zapis/odczyt(+tworzenie pliku) nie działa poprawnie.
P-102599
oputyk
» 2014-01-20 13:20:25
Z tego co tu widzę, to wywala Ci błąd o tym, że obiekt
zd
 nie jest znany.
P-102606
mgrD
Temat założony przez niniejszego użytkownika
» 2014-01-20 13:59:44
@Poprawione, chodzi o "plik". Czekam na dalsze sugestie : )
P-102610
Monika90
» 2014-01-20 14:05:10
Przkazuj plik do funkcji przez referencję
P-102611
oputyk
» 2014-01-20 14:07:09
Obiekt
plik
 jest globalny? Jeśli nie to go prześlij za pomocą referencji do funkcji, albo zdefiniuj nowy plik w funkcji.
P-102613
mgrD
Temat założony przez niniejszego użytkownika
» 2014-01-20 14:20:16
Chyba raczej nie używałem jeszcze referencji, chodzi o dodanie argumentu funkcji "int& cos" ?

@: PRzeczytałęm http://cpp0x.pl/kursy/Kurs-C++​/Poziom-3​/Przekazywanie-argumentow-funk​cji-przez-referencje​/356 i już wiem jak tego używać, pozostało mi pytanie jaki typ referencji powinienem przyjąc dla obiektu plik z klasy "std::fstream"?


C/C++
int main()
{
    std::fstream plik( "liczby.txt", std::ios::out | std::ios::in );
    //....
}

bool sprawdz( int in, std::fstream & test )
{
    for( int p = 0; p < in; p++ )
    {
        if( tekscik[ p ] == tekscik[ in ] ) return 1;
       
    }
   
    while( std::getline( test, str ) )
    {
        found = str.find( tekscik[ in ] );
        if( found == std::string::npos )
        {
            return 1;
            break;
        }
    }
    return 0;
}

Wszystko działa jak pętle while umieszczę jako komentarz, inaczej nic w pliku się nie zapisuję.(błąd leży na 100% w pętli while).


@:Cały kod:
C/C++
#include <iostream>
#include <ctime>
#include <string>
#include <fstream>

char tab[] = "987ABC";
std::string tekscik[ 10 ];
std::string str;
int found;
bool x;

void los( int index );
bool sprawdz( int in, std::fstream & heh );


int main()
{
    std::fstream plik( "liczby.txt", std::ios::out | std::ios::in | std::ios::app );
    srand( time( NULL ) );
   
    for( int j = 1; j < 10; j++ )
    {
        los( j );
        x = sprawdz( j, plik );
        while( x == true )
        {
            tekscik[ j ].clear();
            los( j );
            x = sprawdz( j, plik );
        }
        plik << j << ": " << tekscik[ j ] << "\n";
        std::cout << j << ": los: " << tekscik[ j ] << std::endl;
    }
    plik.close();
    return 0;
}

bool sprawdz( int in, std::fstream & heh )
{
    for( int p = 0; p < in; p++ ) if( tekscik[ p ] == tekscik[ in ] ) return 1;
   
    while( std::getline( heh, str ) )
    {
        found = str.find( tekscik[ in ] );
        if( found == std::string::npos )
        {
            return 1;
            break;
        }
    }
    return 0;
}

void los( int index )
{
    for( int i = 1; i < 4; i++ ) tekscik[ index ] += tab[ rand() %( sizeof( tab ) - 1 ) ];
   
}

Plik się tworzy lecz nie zapisuje danych do pliku(moim zdaniem przyczyną jest pętla while w funkcji "sprawdź").

@Po długim badaniu kodu znalazłem, że kłopot leży w lini
std::getline( heh, str )
Proszę o pomoc.
P-102616
mgrD
Temat założony przez niniejszego użytkownika
» 2014-01-20 15:07:23
@: Delete, zedytowałem poprzedni post.
P-102629
leon_w
» 2014-01-20 23:00:11
Nigdzie nie widzę, żebyś nadawał jakąś wartość dla str.
P-102686
« 1 » 2
  Strona 1 z 2 Następna strona