Čtení z textového souboru v C Vyřešeno

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: listopad 11
Pohlaví: Nespecifikováno
Stav:
Offline

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

Příspěvekod jaker » 30 bře 2014 23:29

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ší??

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

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

Příspěvekod faraon » 31 bře 2014 21:14

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: listopad 11
Pohlaví: Nespecifikováno
Stav:
Offline

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

Příspěvekod jaker » 03 dub 2014 16:33

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: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

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

Příspěvekod faraon » 05 dub 2014 09:52

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: listopad 11
Pohlaví: Nespecifikováno
Stav:
Offline

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

Příspěvekod jaker » 05 dub 2014 12:41

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: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Čtení z textového souboru v C  Vyřešeno

Příspěvekod faraon » 06 dub 2014 22:12

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)


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Blokování stahovaných souborů
    od Riviera kid » 07 čer 2025 16:47 » v Windows 11, 10, 8...
    10
    3228
    od Riviera kid Zobrazit poslední příspěvek
    16 čer 2025 06:56
  • Program na hledání poškozených souborů JPG Příloha(y)
    od Rosta_Kolmix » 09 lis 2024 11:01 » v Design a grafické editory
    2
    4506
    od Minapark Zobrazit poslední příspěvek
    15 lis 2024 11:04
  • IDM hláška o nemožném stažení souboru Příloha(y)
    od bluenite » 04 črc 2024 11:08 » v Vše ostatní (inet)
    2
    4342
    od bluenite Zobrazit poslední příspěvek
    06 črc 2024 19:40
  • Velikost souboru a složek na disku
    od L.L » 05 úno 2025 11:50 » v Vše ostatní (sw)
    5
    3273
    od L.L Zobrazit poslední příspěvek
    05 úno 2025 17:42

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

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů