NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

Diskuze: podminka if (znak != '\n') mi nefunguje

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Pánek:23.1.2024 18:31

Ahoj, nefunguje mi podminka if, kdyz porovnavam znak s novym radkem (ucim se z ucebnice sam)

Zkusil jsem: souboru PISMENA.TXT vypada takto:

Tohle je David,
mozna ho znate.
Cau Cau

a tohle je zdrojovy

#include <stdio.h>

int main(){
    int pocet_znaku_na_radce = 0;
    int znak = 0;
    FILE *fr = NULL;
    FILE *fw = NULL;

    if ((fr = fopen("PISMENA.TXT", "rt")) == NULL){
        fprintf(stderr, "nepodarilo se otevrit soubor PISMENA.TXT\n\n");
        return 1;
    }
    if ((fw = fopen("KOLIK.TXT", "wt")) == NULL){
        fprintf(stderr, "nepodarilo se otevrit soubor KOLIK.TXT\n\n");
        return 1;
    }
    while (znak = getc(fr)){
        if ((znak != '\n') || (znak != EOF)){
            pocet_znaku_na_radce++;
            putc(znak, fw);
        }
        else{
            if (znak != EOF){
                putc(znak, fw);
            }
            else{
                putc('\n', fw);
            }
            fprintf(fw, "%d", (pocet_znaku_na_radce - 1));
            pocet_znaku_na_radce = 0;
            putc('\n', fw);
            if (znak == EOF){
                break;
            }
        }
    }
    return 0;
}

konkretne u radky

if ((znak != '\n') || (znak != EOF)){

mi nejde odchytit znak noveho radku '\n'

Chci docílit: v programu vscode jsem si zapnul krokovani.
a v 15 cyklu je videt, ze v promenne znak je hodnota 10 tedy ten novy radek,
ale kdyz krokuji dal, tak podminka se povazuje za splnenou a neskoci na else

 
Odpovědět
23.1.2024 18:31
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Pánek
DarkCoder:23.1.2024 20:28

Ta podmínka vždycky bude true, nikdy Ti tak naskočí řízení programu do sekce else. Nikdy totiž nemůže nastat že znak bude '\n' a zároveň EOF. Musíš použít logický AND &&.

Jinak znak není třeba inicializovat.
Když prochazis soubour do jeho konce, pak cteny znak musíš porovnávat s EOF.

#include <stdio.h>

int main(void) {
    int pocet_znaku_na_radce = 0;
    int znak;
    FILE *fr = NULL;
    FILE *fw = NULL;

    if ((fr = fopen("PISMENA.TXT", "rt")) == NULL) {
        fprintf(stderr, "nepodarilo se otevrit soubor PISMENA.TXT\n\n");
        return 1;
    }

    if ((fw = fopen("KOLIK.TXT", "wt")) == NULL) {
        fprintf(stderr, "nepodarilo se otevrit soubor KOLIK.TXT\n\n");
        fclose(fr);
        return 1;
    }

    while ((znak = fgetc(fr)) != EOF) {
        if (znak != '\n') {
            fputc(znak, fw);
            pocet_znaku_na_radce++;
        } else {
            fprintf(fw, "%d\n", pocet_znaku_na_radce);
            pocet_znaku_na_radce = 0;
        }
    }

    fclose(fr);
    fclose(fw);

    return 0;
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
23.1.2024 20:28
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Michal Pánek:23.1.2024 21:17

Uz to vidim, spatne jsem tu podminku pochopil. Dekuji

 
Nahoru Odpovědět
23.1.2024 21:17
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Pánek
DarkCoder:23.1.2024 22:04

Nemáš zač. Je běžné že člověk udělá chybu při vytváření složité podmínky. Může pomoci to, že si řekneš pravý opak a pořadí vyhodnocení otočíš.

Ve tvém případě:

Co se stane, kdyz načtu znak nového řádku nebo konce souboru?

Je to oak mnohem srozumitelnější..

Nahoru Odpovědět
23.1.2024 22:04
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
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 4 zpráv z 4.