Jump to content
Sign in to follow this  
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;
}
 

 

Share this post


Link to post
Share on other sites

A te pakiety nie są może oddzielone pustą linią, którą zapomniałeś pominąć?

Share this post


Link to post
Share on other sites

Plik jest jednolicie zapisany, linia pod linią. Dodam, że sytuacja tak samo wygląda na Windowsie, jak i na Linuxie. Używam Code Blocks'a.

Share this post


Link to post
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ć.

Share this post


Link to post
Share on other sites

Niestety moja kryształowa kula nie jest kompatybilna z sygnałem DVB-T.

 

Daj kod. Ahh, przepraszam, skrypt forum chowa teraz kod.

Edited by Mormegil

Share this post


Link to post
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

Share this post


Link to post
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. 

Share this post


Link to post
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")?

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...