Čtení z textového souboru v C

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

jaker
nováček
Příspěvky: 29
Registrován: 20 lis 2011 15:12

Re: Čtení z textového souboru v C

Příspěvek od jaker »

Dobře na ten return kouknu zítra...
Toho špatnýho dekódování prvního písmene jsem si všiml, jen jsem to zatím nevyřešil ale dělá se na tom :-)
Taky jsem zkoušel ((b=getch())!= '\n') a ve windows to nefunguje ještě jsem taky zkoušel toto a taky nic: (((b=getch())!= 13)||((b=getch())!=10)).
U toho zpětnýho překladu mi to nedošlo... teď to vidím díky zkusím to upravit :D
Té kompilaci moc nerozumím... nevím proč to má čtyřiatřicet kilobajtů :smile: jak se to dá stáhnout a co musím dělat pro to aby se to, abych to měl co nejmenší??
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7405
Registrován: 23 pro 2010 09:23

Re: Čtení z textového souboru v C

Příspěvek od faraon »

Je lepší místo číselného kódování zadat přímo znak, protože můžeš narazit na stroj který bude používat jiné kódování než ASCII.
13 = '\r' = CR (Carriage Return) - vrátí kurzor na začátek řádku
10 = '\n' = LF (Line Feed) - posune kurzor o řádek níž, také NL (New Line)

Céčko zná ještě tyhle:
'\a' = BEL nebo Alarm - pípnutí
'\b' = BS - BackSpace - smaže předchozí znak
'\f' = FF - Form Feed - další stránka
'\t' = HT - Horizontální Tabulátor
'\v' = VT - Vertikální Tabulátor
'\\' = \
'\?' = ?
'\'' = '
'\"' = "
'\0' = NULL - znak s kódem 0, ukončující řetězec v paměti
'\0nn' = osmičkový kód znaku
'\xnn' = šestnáctkový kód znaku

Vyzkoušej ještě tohle:
while ((b=getch())>= ' ')
To by mělo reagovat na všechny klávesy s kódem menším než mezerník, takže i na Escape, šipky a všechny Fx.

Parametry kompilace by se měly nastavit někde v IDE, s tím ti neporadím. Já si pamatuji akorát že v DevC++ mi zkompilované binárky vycházely nepatrně menší než v Linuxu, pak jsem z Widlí definitivně odešel.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)
jaker
nováček
Příspěvky: 29
Registrován: 20 lis 2011 15:12

Re: Čtení z textového souboru v C

Příspěvek od jaker »

Tak tento příkaz funguje jak má...: while ((b=getch())>= ' ') :-)
Můžeš mi ještě pošťouchnout s tím return (main()); ? nějak mě nic nenapadá jak to mám vyřešit :?
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7405
Registrován: 23 pro 2010 09:23

Re: Čtení z textového souboru v C

Příspěvek od faraon »

Koukám že jsi ten switch ještě úplně nepochopil. Máš tam tohle:

Kód: Vybrat vše

    switch(volba)                                                               // hlavní menu v main()
          {
          case 'D': printf("Vypni si CapsLock!\r\n");
                    vstupD();
                    break;                // Upozorneni na CapsLock a pokraèování v programu
          case 'd': vstupD();                                                 // pøi stisku d nebo D volá funkci vstupD
                    break;                                                  // potom vyskoèí ze switche ven

          case 'Z': printf("Vypni si CapsLock!\r\n");
                    vstupZ();
                    break;
          case 'z': vstupZ();
                    break;

          case 'K':                                                           // neudìlá nic, rovnou pokraèuje dalším case
          case 'k': return 0; // pokud zadal k, ukoncim main

          default: system("clear");
                   printf("Mel jsi zmacknout \'d\',\'z\' nebo \'k\' a ne \'%c\' \r\n", volba);
                   return(main());  // pøi stisknutí jiného tlaèítka než je nadefinované se zobrazí chybová zpráva
            }

přitom by stačilo tohle:

Kód: Vybrat vše

    switch(volba)                                                               // hlavní menu v main()
          {
          case 'D': printf("Vypni si CapsLock!\r\n");
          case 'd': vstupD();                                                 // pøi stisku d nebo D volá funkci vstupD
                    break;                                                  // potom vyskoèí ze switche ven

          case 'Z': printf("Vypni si CapsLock!\r\n");
          case 'z': vstupZ();
                    break;

          case 'K':                                                           // neudìlá nic, rovnou pokraèuje dalším case
          case 'k': return 0; // pokud zadal k, ukoncim main

          default: system("clear");
                   printf("Mel jsi zmacknout \'d\',\'z\' nebo \'k\' a ne \'%c\' \r\n", volba);
                   return(main());  // pøi stisknutí jiného tlaèítka než je nadefinované se zobrazí chybová zpráva
            }

Těch '\r' si nevšímej, to tam mám kvůli ncurses, aby mi fungoval ten tvůj getch().

A teď je vhodná chvíle zapřemýšlet o hlavním cyklu, běžícím v main(). Předpokládám že program by měl pracovat dokud mu nenařídíš skončit, takže by ten switch bylo vhodné umístit do cyklu. A protože main() ukončuješ tím podmíněným return, můžeš použít nekonečný cyklus. Nejjednodušeji se v Céčku udělá takhle: for (;;).
Také by se program měl zeptat jestli chceš opravdu skončit, pamatuj na to že uživatel je ve skutečnosti ještě větší blbec než si programátor dovede představit (opačně to ale platí také!). Pak jádro programu bude vypadat takhle:

Kód: Vybrat vše

for (;;)
    {
    printf("Zadej smer prekladu: \r\n\r\n");
    .....

    switch(volba)                                                               // hlavní menu v main()
          {
          .....

          case 'K':                                                           // neudìlá nic, rovnou pokraèuje dalším case
          case 'k': printf("Chces ukoncit program?\r\n");
                    if ('a'==(volba=getch()) || 'A'==volba)
                       return 0;
                    else
                       break;

          .....
            }
    }

Nedávám to sem celé, jen podstatné části.
Samozřejmě také musíš ty hrůzy return (main()) opravit na normální return 0!

A protože tam máš další podobné skrytě rekurzivní hrůzy v obou podprogramech, tak by bylo vhodné je také odstranit a nahradit nějakými podobnými cykly...
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)
jaker
nováček
Příspěvky: 29
Registrován: 20 lis 2011 15:12

Re: Čtení z textového souboru v C

Příspěvek od jaker »

Ten nekonečný cyklus jsem zkoušel už předtím. Používal jsem while(1), ale pořád se mi to vracelo až na začátek... Už jsem to ale vyřešil. Díky za pomoc :-)
Dále jsem vyřešil to "zprasení" prvního znaku při zpětném překladu a také zpětný překlad. Okoukneš mi to rychlím očkem jestli tam není ještě nějaká velká prasárna?
http://leteckaposta.cz/925361908
Za vše moc díky! Nebýt tebe, tak jsem to nikdy nedodělal :smile:
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7405
Registrován: 23 pro 2010 09:23

Re: Čtení z textového souboru v C

Příspěvek od faraon »

Vypadá to že všechno funguje, i když jsem nevyzkoušel všechny kombinace chybně stisknutých kláves, takže netuším co všechno se tam dá zašmodrchat.

Velké prasárny tam nevidím, kromě toho system("cls"), to bolí. Tohle totiž v počítači spustí celý příkazový interpret CMD, což zabere hromadu času a paměti, aby provedl jediný integrovaný příkaz, který by navíc v konzoli měl jít nahradit vypsáním jediného znaku '\f' s ASCII kódem 12. Tedy pokud to ještě funguje jako dřív v DOSu, on ten redmondský emulátor terminálu dost věcí provádí jinak než by měl!
Jedna věc co mě trochu rozhazuje je to tvoje rozházené odsazování, hrozně blbě se poznává co k čemu patří. Třeba v Pythonu bys s tímhle tvrdě narazil, tam je místo { } právě odlišná úroveň odsazení, navíc se rozlišují tabulátory a mezery. Časem sám přijdeš na to že je lepší když související bloky rozeznáš jedním pohledem i z několika metrů...

Ještě ti prozradím jednu fintu, překladač řetězcové literály spojuje, takže se dá udělat tohle:

Kód: Vybrat vše

        printf("Nacteni: \n\n"
               "  s - ze slozky\n"
               "  t - zadanim textu\n"
               "  z - zpet\n");

Hlavně mezi ně nenadělej čárky, to bys z toho udělal pole.
Takhle to funguje jako kdybys zadal jediný řetězec, i když ve zdrojáku ho máš přehledně rozsekaný na řádky, jak to přijde pod sebe. Ušetříš tím několik volání té funkce, což se projeví na rychlosti i velikosti programu. Ony ty standardní prinf() a scanf() jsou dost komplexní, proto také poněkud pomalé. I když pokud je nevoláš tisíckrát za sekundu, tak to zase tak hrozné není 8)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)
Zamčeno
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Blokování stahovaných souborů
    od Riviera kid » » v Windows 11, 10, 8...
    10 Odpovědi
    6832 Zobrazení
    Poslední příspěvek od Riviera kid
  • Velikost souboru a složek na disku
    od L.L » » v Vše ostatní (sw)
    5 Odpovědi
    5688 Zobrazení
    Poslední příspěvek od L.L

Zpět na „Programování a tvorba webu“