Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
discount 30 + hiring

Diskuze: Jednoduchá práce se souborem v C - načtení znaků ze souboru

Aktivity
Avatar
DoZby
Člen
Avatar
DoZby:28.2.2021 16:14

Ahoj mám zadání: Napiš program, který přečte soubor SOUBOR.txt po řádcích. Každý řádek vypíše do 'cmd' a na nový řádek uvede, kolik znaků na ní bylo.

Můj program:

#include <stdio.h>

int main()
{
  FILE *fr;
  int c, i;

  fr = fopen("SOUBOR.TXT", "r");

  while ((c = getc(fr)) != EOF){
      if (c != '\n'){
        putc (c, stdout);
        i++;
      }
      else {
        printf("\nPocet znaku na radku: %d\n", i);
        i = 0;
      }
  }
  printf("\nPocet znaku na radku: %d\n", i); // Slouzi pro vypsani poctu znaku u posledniho radku
  fclose(fr);
  return 0;
}

Díky funkci EOF mi otestuje konec souboru, ale tím, že už dojel dokonce se nevypíše počet znaků na posledním řádku.

Zkusil jsem: Zkoušel jsem to obejít tím, že jsem po skončení while dopsal ještě jednou printf, aby mi vypsal uloženou hodnotu (počet znaků na řádku). To funguje, ale určitě to jde líp.

Chci docílit: Snažím se dosáhnout toho, aby se mi vypsal i u posledního řádku počet znaků, bez toho, abych používal printf ještě jednou navíc.

Odpovědět
28.2.2021 16:14
Ztrácej svůj čas a čekej na zázrak
Avatar
DarkCoder
Člen
Avatar
Odpovídá na DoZby
DarkCoder:28.2.2021 18:12

Pokud potřebuješ, aby se vykonala určitá část kódu aspoň jednou (v tomto případě vždy výpis počtu znaků na řádce), pak je třeba použít cyklus do-while a nikoli cyklus while.

do {
        c = getc(fp);
        if (c != '\n' && c != EOF) {
                putchar(c);
                pocet_znaku++;
        }
        else {
                printf("\nPocet znaku na radce: %d\n", pocet_znaku);
                pocet_znaku = 0;
        }
} while (c != EOF);

Aby vše fungovalo správně, je třeba, aby proměnná pocet_znaku byla inicializována na 0. Pokud tomu tak nebude, bude hodnota počtu znaků první řádky nesmyslná.

int pocet_znaku = 0;

Funkce fopen() může selhat, respektivě může dojít k tomu, že se do ukazatele na soubor přiřadí hodnota NULL.
Je tedy nutné tuto hodnotu otestovat, než se začne pracovat se souborem. Např.

fp = fopen("SOUBOR.TXT", "r");
if (!fp) {
        fprintf(stderr, "Chyba otevreni souboru.\n");
        exit(1);
}

Funkce exit() vyžaduje vložení hlavičkového souboru stdlib.h.

Použití názvu proměnné i pro hodnotu počtu znaků na řádce není zrovna ideální.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
28.2.2021 18:12
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
DoZby
Člen
Avatar
Odpovídá na DarkCoder
DoZby:28.2.2021 19:06

Díky moc za podrobné vysvětlení :-), vše už funguje jak má.

Nahoru Odpovědět
28.2.2021 19:06
Ztrácej svůj čas a čekej na zázrak
Avatar
DarkCoder
Člen
Avatar
Odpovídá na DoZby
DarkCoder:28.2.2021 19:21

Napiš program, který přečte soubor SOUBOR.txt po řádcích.

Ještě jeden, dost možná podstatný dodatek. Pokud má být soubor čten po řádcích,
je třeba použít funkci fgets() nikoli funkci fgetc() či makro getc().

Avšak myšlenka, že je třeba použít správný cyklus, zůstává stejná.

Nahoru Odpovědět
28.2.2021 19:21
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.