Jump to content
szymok

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

Recommended Posts

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 to comment
Share on other sites

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 to comment
Share on other sites

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.

  • Upvote 1
Link to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...