Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. 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í.

Diskuze – Lekce 2 - Práce s textovými soubory v jazyce C

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Student C
Člen
Avatar
Odpovědět
7.5.2018 13:33
Cree que puedes manejarlo
Avatar
krepsy3
Tvůrce
Avatar
Odpovídá na Lukáš Hypša
krepsy3:14.9.2022 22:39

To je taková obskurnost, kvůli jejímuž pochopení je třeba podívat se trochu na historii ASCII.
Máme totiž v podstatě dva znaky, které značí konec řádky. Označují se jako CR a LF, v C (a dalších jazycích typu C++, C#, Java...) je zapíšeme jako '\r' a '\n'. Ještě doplním, že jejich číselný kód (tedy číslo, které dostaneme, když je přetypujeme na int) je pro CR 13 (0xD) a pro LF 10 (0xA).

Jak a k čemu byly tyto znaky původně vymyšleny? Jak je asi patrné, jedná se o netisknutelné znaky, a to odřádkování skutečně je - ten znak se v souboru nachází, ale my jej na obrazovce při přečtení souboru nevidíme, vidíme jen konec řádku. Takové znaky se označují jako řídicí. CR i LF jsou řídícím znakem, který má dnes význam pro ukončení řádku, ovšem jejich skutečná sémantika se liší, a vychází defacto z psacího stroje.

Původní terminály, kterými se před nástupem obrazovek s elektronickou klávesnicí připojovalo k mainframovému počítači, měly skutečně podobu psacího stroje, důležitá je část, která psala na papír - byla to hlava, které se po papíře pohybovala zleva doprava, a vždy napsala jeden znak. Když se došlo na konec řádku, hlava se vrátila zase doleva a válec, na němž byl papír namotán, se posunul o velikost výšky jednoho řádku.

CR znamená "Carriage Return", česky návrat vozíku. A je to příkaz pro zápisovou hlavu, aby se vrátila na začátek řádku. LF znamená line feed, česky odsunutí řádku, a je to příkaz pro papír, aby se pohnul o řádek dolů. Je tedy patrné, že oba znaky jsou velmi důležité pro to, aby správně fungoval textový výstup na psacostrojový terminál. Ale zároveň jsou situace, kdy se hodí použít jeden z nich bez druhého. Kupříkladu pokud chceme udělat několik prázdných řádek, stačí nám pouze několikrát LF (a jen jednou CR). Nebo když chceme napsat nějaký text tučně, napíšeme nejprve celou řádku normálně, pak uděláme jen CR a pak napíšeme mezeru na pozici, kde chceme normální text, a stejný znak podruhé na pozici, kde chceme tučný text.

Samozřejmě dnes už nemají postupy výše relevanci, vše je elektronické a odřádkováním se rozumí skok kurzoru o řádek níže a na nejlevější (či nejpravější, píšeme-li arabsky) pozici, jako jedna operace. ASCII nám ale zůstává, a tak si operační systémy mohly vybrat, jak budou odřádkování reprezentovat. Linux si zvolil LF, MAC OS si zvolil CR a Windows si zvolil CRLF. A tato rozhodnutí se kvůli zpětné kompatibilitě táhnou dodnes.

MAC OS od verze 10 nově používá LF, takže je 100% kompatibilní s Linuxem, ale mohly se rozbít soubory vytvořené programem v MAC OS 9 a starším. Co se Windows týče, mnoho aplikací je připraveno na konce řádků jen pomocí LF (všechny terminály, ať už cmd nebo Powershell a pochopitelně i windowsovský port bashe, a třeba také Wordpad, VS i VS Code, notepad++, PSPad...). Mnoho aplikací ale ne, jako třeba ten poznámkový blok (notepad) co je u tebe na printscreenu. Dost možná by tvůj soubor ve wordpadu vypadal správně.

Výpis v konzoli tedy bude vypadat správně, neboť terminálu stačí pro odřádkování LF a veškeré CR znaky prostě ignoruje. Pokud chceš, aby soubor vypadal správně i v Poznámkovém bloku, nahraď \n v fprintf příkazech za \r\n.

Odpovědět
14.9.2022 22:39
Programátor je stroj k převodu kávy na kód.
Avatar
DarkCoder
Člen
Avatar
DarkCoder:16.9.2022 12:52

V článku je mnoho mylných a chybějících informací.

Zde jsou ty nejpodstatnější:

Pro práci se soubory je nutné vložit hlavičkový soubor stdio.h.
Funkce fputs() narozdíl od funkce puts() neprovádí odřádkování.
Funkce gets() je zastaralá a již se nepoužívá.
Funkce gets() nenahrazuje funkci scanf().
Funkce fgets() ne vždy přidává znak nového řádku do načteného řetězce.
Oprávnění není jediný důvod proč se nepodařilo otevřít soubor pomocí fopen().
Macro EOF může představovat jak chybu tak i indikaci, že se došlo na konec souboru.

Odpovědět
16.9.2022 12:52
"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 3 zpráv z 13.