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

Problem z pętlą while i funkcją fscanf

Ostatnio zmodyfikowano 2016-11-30 00:49
Autor Wiadomość
Temat założony przez niniejszego użytkownika
Problem z pętlą while i funkcją fscanf
» 2016-11-29 22:21:27
Witam,
Mam problem z programikiem a dokładniej z blokiem z pętlą while w moim programie. Umieszczę pierwsze kod a potem wyjaśnie o co dokładnie mi chodzi
C/C++
int main()
{
    float x, y, z1, srednia, suma = 0, pomocnicza = 0;
    int i, licznik = 0;
   
    FILE * plikowazap = fopen( "dane.txt", "wt" );
    FILE * plikowaodcz = fopen( "dane.txt", "rt" );
   
   
    srand( time( 0 ) );
   
    for( i = 0; i < 1000; i++ )
    {
        x =( rand() + 1.0 ) /(( RAND_MAX + 0.0 ) + 1.0 );
        y =( rand() + 1.0 ) /(( RAND_MAX + 0.0 ) + 1.0 );
       
        z1 = cos( 2 * M_PI * y ) * sqrt(( - 2 ) * log( x ) );
       
        fprintf( plikowazap, "%f\n", z1 );
       
    }
   
    while( fscanf( plikowaodcz, "%f", & pomocnicza ) != EOF )
    {
        printf( "%f\n", pomocnicza );
        suma += pomocnicza;
        licznik++;
    }
   
    printf( "\nLicznik =%d\n", licznik );
    printf( "Suma =%f\n", suma );
   
    srednia = suma /( float )( licznik );
   
    printf( "Srednia = %f\n", srednia );
   
    fclose( plikowazap );
    fclose( plikowaodcz );
   
    system( "pause" );
   
    return 0;
}
Na początku definiuję sobie 2 zmienne plikowe, jedna do zapisu, druga do odczytu. Następnie w  pętli for losuję liczby x,y z zakresu (0:1] (działa dobrze, sprawdzone) i liczę z ich pomocą jakieś z1 które zapisuję do pliku tekstowego. I tutaj zaczyna się coś czego nie rozumiem, mam pętlę while która czyta wcześniej wyliczone dane z pliku i liczy jakąś sumę, jednakże pętla ta zachowuje się w sposób nieprzewidywalny dla mnie. Jeżeli w pętli for ma 1000 obiegów (1000 liczb w pliku tekstowym) to pętla while ma ich około 863 (wiem to na podstawie zmiennej licznik), co jeszcze ciekawsze jeżeli zmniejszymy ilość pętli poniżej 300 pętla while nigdy nie wystartuje. Nie mam pojęcia dlaczego tak się dzieje czy mógłby ktoś mi to wyjaśnić?
P-154303
» 2016-11-30 00:49:37
1. Twórz jeden obiekt do odczytu i zapisu (tryb np: "w+")
2. Istnieje coś takiego jak bufor. Program co rusz nie wysyła do systemu informacji zapisz znak do końca piku bo by musiał ciągle obsługiwać tylko te żądania i zabierało by to zbyt dużo czasu. Dlatego wymyślono bufor danych. Należy wywołać funkcje:
int fflush ( FILE * stream );
która przepisuje dane z bufora na strumień wyjściowy. Aby mieć wszystkie dane wypisane.
P-154318
« 1 »
  Strona 1 z 1