Načítání znaků ze souboru (jazyk C) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načítání znaků ze souboru (jazyk C) – C / C++ – Fórum – Programujte.comNačítání znaků ze souboru (jazyk C) – C / C++ – Fórum – Programujte.com

 

Spartakus
~ Anonymní uživatel
1 příspěvek
1. 4. 2013   #1
-
0
-

Zdravím. Uměl by někdo poradit, proč mi tento kód nedokáže načíst první znak v souboru a místo toho raději načítá mezeru?

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

int PocetRadku(FILE *fr) //zjistím si počet řádků
{
    int c;
    int pocet = 1;

    while((c = getc(fr)) != EOF)
        if (c == '\n') pocet++;

    return pocet;
}

int je_cislice(char znak)
{
    if(((znak >= '0') && (znak <= '9')) || znak == '-')
        return 1;
    else
        return 0;
}

//void soucet_cisel(const char* vstup, const char* vystup)
void soucet_cisel(const char* vstup)
{
    FILE *fr, *fw;

    fr = fopen(vstup, "r");
    //fw = fopen("vylsdek.txt", "a+");

    int pocet_radku, soucet, i, help;
    pocet_radku = PocetRadku(fr);
    //printf("%d", pocet_radku);
    char znak;


    if(fr == NULL)
    {
        printf("Soubor nenalezen!!!\n");
        system("PAUSE");
        return 0;
    }

    for(i = 1; i <= pocet_radku; i++)
    {
        soucet = 0;
        while(((znak = fgetc(fr)) != '\n') || (znak != EOF))
        {
            printf("%c!\n", znak);
            if(je_cislice(znak))
            {
                printf("%c", znak);
                ungetc(znak, fr);
                fscanf(fr,"%d", &help);
                soucet += help;
            }
            else break;
        }
        printf("Soucet je %d\n", soucet);
        i++;
    }
    fclose(fr);
}


int main()
{
    /*   FILE *fr;
       if((fr = fopen("vstup.txt","r")) == NULL)     //test otevreni
       {
           printf("Soubor se nepodarilo otevrit.\n");
           system("pause");
           return 1;
       }


       printf("Pocet radku %d\n",PocetRadku(fr));
       printf("%d", je_cislice('a'));*/

    soucet_cisel("vstup.txt");

    return 0;
}

Soubor pro testování u mě vypadá takto:

1 2 2

Nahlásit jako SPAM
IP: 90.178.157.–
zlz
~ Anonymní uživatel
634 příspěvků
1. 4. 2013   #2
-
+1
-
Zajímavé

Nevím, proč to načítá mezeru, ale když ten soubor celý načítáš 2x, tak by asi bylo dobré se mezitím přesunout zase na začátek - funkce rewind.

Mimo to tam ten počet řádků zjišťovat nepotřebuješ, to i++ máš v hlavičcce i těle foru a ten test na konec řádku by asi měl být dokud není konec řádku ani konec souboru.

Nahlásit jako SPAM
IP: 80.188.216.–
1. 4. 2013   #3
-
0
-

Díky, rewind mi vůbec nedošel. Moje chyba :)

Takto je to vyřešeno:

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

int PocetRadku(FILE *fr) //zjistím si počet řádků
{
    int c;
    int pocet = 1;

    while((c = getc(fr)) != EOF)
        if (c == '\n') pocet++;

    return pocet;
}

int je_cislice(char znak)
{
    if(((znak >= '0') && (znak <= '9')) || znak == '-')
        return 1;
    else
        return 0;
}

//void soucet_cisel(const char* vstup, const char* vystup)
void soucet_cisel(const char* vstup)
{
    FILE *fr, *fw;

    fr = fopen(vstup, "r");
    //fw = fopen("vylsdek.txt", "a+");

    int pocet_radku, soucet, i, help;
    pocet_radku = PocetRadku(fr);

    rewind(fr);

    char znak;


    if(fr == NULL)
    {
        printf("Soubor nenalezen!!!\n");
        system("PAUSE");
        return 0;
    }

    for(i = 1; i <= pocet_radku; i++)
    {
        soucet = 0;
        while(((znak = getc(fr)) != '\n') && (znak != EOF))
        {
            if(je_cislice(znak))
            {
                ungetc(znak, fr);
                fscanf(fr,"%d", &help);
                soucet += help;
            }
        }
        printf("Soucet je %d\n", soucet);
    }
    fclose(fr);
}


int main()
{
    soucet_cisel("vstup.txt");

    return 0;
}
Nahlásit jako SPAM
IP: 90.178.157.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 28 hostů

Podobná vlákna

Nacitani souboru v C — založil latis

Nacitani souboru — založil tester

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý