Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

szymok

Rozwiązany: Niekompletne odczytywanie linii z pliku <C>

Polecane posty

Witam. 

W pliku tekstowym, w każdej linii, mam zapisane odpowiednio: pytanie, 4 odpowiedzi i prawidłową odpowiedź. Po poniższym kodzie oczekuję, że program wyświetli  mi 3 takie "pakiety". Jednak wyświetlanie kończy się  na połowie 3 odpowiedzi ostaniego "pakietu". Dlaczego tak się dzieje. Skąd w ogóle czytanie połowy łańcucha znaków, skoro korzystam z funkcji fgets? Przepełnienie tablicy znaków nie wchodzi w grę. 

Pozdrawiam.

Spoiler

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *questions;
    int i;
    if ((questions = fopen ("pytania.txt", "r"))){

                char question_tmp [250];
                char answer1_tmp [50];
                char answer2_tmp [50];
                char answer3_tmp [50];
                char answer4_tmp [50];
                char correct_tmp [2];

                for (i=0; i<3; i++){
                fgets( question_tmp, 250 , questions );
                fgets( answer1_tmp, 50 , questions );
                fgets( answer2_tmp, 50 , questions );
                fgets( answer3_tmp, 50 , questions );
                fgets( answer4_tmp, 50 , questions );
                fgets( correct_tmp, 2 , questions );


                printf ("%s", question_tmp);
                 printf ("%s", answer1_tmp);
                 printf ("%s", answer2_tmp);
                 printf ("%s", answer3_tmp);
                 printf ("%s", answer4_tmp);
                 printf ("%s", correct_tmp);
            }
    }
    return 0;
}
 

 

Link do komentarza
Udostępnij na innych stronach

W pliku mam więcej linii, niż próbuję wczytać. A sam program ucina linię np 3 od końca (ma jeszcze np wyświetlić 3 odpowiedzi, a ucina już pierwszą). Miejsce cięcia w linii, oraz sama ucięta linia, zależy od tego, ile pakietów chcę wczytać i wyświetlić.

Link do komentarza
Udostępnij na innych stronach

Zmień rozmiar  correct_tmp z 2 na 3 w definicji i przy odczycie.

 

Uzasadnienie jest takie:

fgets wczytuje "pseudo typ" o nazwie null terminated string. Ten typ napisów charakteryzuje się tym, że kończy się zerem. Fgets ma taką miłą właściwość, że koniec linii traktuje jako "istotny" znak i umieszcza go we wczytanym stringu kończąc jednocześnie dalszą analizę.

 

Kiedy więc wczytywana jest linia z poprawną odpowiedzią: "3\n", to fgets wczytuje znak '3' i kończy bo może umieścić w stringu jedynie dwa znaki '3' i '\0'. Następne wywołanie fgets, dostaje coś takiego "\nPytanie X + 1" i wczytuje pojedynczy znak '\n'. Dopiero fgets( answer1_tmp, 50 , questions ); wczyta "Pytanie X + 1".

 

\n to koniec linii

\0 to null - czyli zero

 

Na przyszłość polecam zaprzyjaźnić się z debuggerem.

Link do komentarza
Udostępnij na innych stronach

Dziękuję bardzo za pomoc i  dokładne wytłumaczenie. Jednak dodam, że zmiana z 2 na 3 jeszcze nic nie dała. Dopiero 4 załatwia sprawę.

A co do debuggera, tak, wiem. Próbowałem kontrolować poszczególne tablice znakowe, jednak z dosyć miernym skutkiem. Chyba pora dorwać jakiś porządny tutorial obsługi.

Dzięki raz jeszcze. 

Link do komentarza
Udostępnij na innych stronach

Problem rozwiązany, więc temat zamykam.
W razie potrzeby otwarcia tematu, proszę autora o kontakt przez PW.

27 minut temu, szymok napisał:

Jednak dodam, że zmiana z 2 na 3 jeszcze nic nie dała. Dopiero 4 załatwia sprawę.

Może to Windowsowy koniec linii ("\r\n")?

Link do komentarza
Udostępnij na innych stronach

Gość
Temat jest zablokowany i nie można w nim pisać.


  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...