Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru



Podobné dokumenty
Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Programování v jazyce C pro chemiky (C2160) 8. Načítání a zápis PDB souboru

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

- jak udělat konstantu long int: L long velka = 78L;

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Programování v jazyce C pro chemiky (C2160) 9. Práce s PDB soubory

Algoritmizace a programování. Terminálový vstup a výstup

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Standardní vstup a výstup

Programování v jazyce C pro chemiky (C2160) 7. Ukazatele, Funkce pro práci s řetězci

Programovací jazyk Pascal

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

printf - formatovany vystup

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

vstup a výstupv jazyce C

Vstup a výstup datové proudy v C

IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Základy programování (IZP)

Základy programování (IZP)

VISUAL BASIC. Práce se soubory

PROGRAMOVÁNÍ V SHELLU

Formátové specifikace formátovací řetězce

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Řešení sady 1. Úvod do programování 1 Tomáš Kühr

E+034 = ; = e E+034

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

C2110 Operační systém UNIX a základy programování

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Programovanie v jazyku C - struktury a polia

vstup a výstupy jazyce C

Operační systémy. Cvičení 3: Programování v C pod Unixem

Práce se soubory. Základy programování 2 Tomáš Kühr

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Jazyk C# a platforma.net

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Úvod do programování. Lekce 1

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Lekce 19 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Základy programování (IZP)

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Operační systémy. Cvičení 4: Programování v C pod Unixem

Algoritmizace a programování

6. Příkazy a řídící struktury v Javě

Proměnná a její uložení v paměti

8. Načítání a zápis PDB souboru

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Základy jazyka C. Základy programování 1 Tomáš Kühr

Standardní algoritmy vyhledávací.

10 Práce s řetězci - pokračování

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

2 Datové typy v jazyce C

ZÁPOČTOVÝ TEST. Zpracoval Vilém Závodný, #include "stdafx.h" #include "stdio.h"

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Sada 1 - Základy programování

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Zápis programu v jazyce C#

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Prezentace a vysvětlení programového prostředí NXC

Textové popisky. Typ dat

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Základy programování (IZP)

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Algoritmizace a programování

VY_32_INOVACE_08_2_04_PR

ŘÍDÍCÍ STRUKTURY - PODMÍNKY

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

X36UNX 16. Numerické výpočty v sh příkazy expr, bc, dc. Zdeněk Sojka

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Základy programování (IZP)

Knihovna XmlLib TXV druhé vydání říjen 2012 změny vyhrazeny

Programy na PODMÍNĚNÝ příkaz IF a CASE

11b Další příklady operací vstupu a výstupu (úvod viz 10)

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Textové soubory

Příklad: Součet náhodných čísel ve vektoru s počtem prvků, které zadá uživatel, pomocí sum() a pomocí cyklu for. Ověříme, že příliš výpisů na

PROGRAMOVÁNÍ V C++ CVIČENÍ

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Programování. Bc. Veronika Tomsová

1. Téma 12 - Textové soubory a výjimky

Transkript:

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

Čtení dat ze souboru FILE *f = NULL; char str[10] = ""; float a = 0.0, b = 0.0; Soubor otevíráme v režimu pro čtení "r" f = fopen("/home/martinp/testdata/test1.txt", "r"); if (f == NULL) { printf("nelze otevrit vstupni soubor!\n"); return 1; } fscanf(f, "%9s %f %f", str, &a, &b); printf("nactena data: %s %f %f\n", str, a, b); fclose(f); f = NULL; return 0; Data načítáme funkcí fscanf(). Před jména proměnných dáváme znak & kromě řetězcových proměnných. Vstupní soubor: values 3.78 2.5 2

Čtení dat ze souboru Podobné jako při zápisu do souboru Soubor otevíráme funkcí fopen() v režimu pro čtení "r" Testujeme, zda-li bylo otevření úspěšné, tj. zda-li funkce fopen() vrátila hodnotu různou od NULL Funkce fscanf() se používá podobným způsobem jako scanf(), první parametr je však identifikátor souboru (typu FILE *) U jmen proměnných předávaných funkci fscanf() musíme používat & (kromě řetězcových proměnných) Pokud neznáme počet hodnot ve vstupním souboru, načítáme zpravidla postupně jednotlivé hodnoty v cyklu dokud nenarazíme na konec souboru Konec souboru zjistíme pomocí funkce feof(identifikátor souboru), která vrací hodnotu různou od 0 v případě že bylo dosaženo konce souboru 3

1 2.5 2 3.5 3 4.7 4 8.6 5 8.9 Čtení dat ze souboru příklad 2 // Program nacte soubor s hodnotami (viz. ramecek vlevo) // Na zacatku programu definujeme #define MAX_ITEMS 100 int count = 0; // Pocet nactenych hodnot int numbers[max_items] = {0}; // Pole pro nacteni 1. hodnot float values[max_items] = {0.0}; // Pole pro nacteni 2. hodnot FILE *f = NULL; f = fopen("/home/martinp/testdata/cisla.txt", "r"); if (f == NULL) { printf("nelze otevrit vstupni soubor!\n"); return 1; } while (feof(f) == 0) { if (count >= MAX_ITEMS) { printf("velikost pole neni dostatecna!\n"); break; } fscanf(f, "%i %f", &numbers[count], &values[count]); count++; } fclose(f); f = NULL; 4

Formátovaný vstup Funkce scanf() a fscanf() používají pro načtení hodnot proměnných formátovací prvky (%i, %f, %c, %s atd.) Formátovací prvky specifikují typ proměnné do které se bude načítat (int, float, char) a zároveň typ dat která se budou načítat (celé číslo, desetinné číslo, textový řetězec) Kromě toho lze ovlivnit způsob načítání pomocí parametrů (příznaky, šířka, modifikátor) význam těchto parametrů je však odlišný než u funkcí pro formátovaný vstup Obecný zápis formátovacích prvků pro načítání vstupu: %[příznaky][šířka][modifikátor]konverze Příklad: příznak %*9lf šířka konverze modifikátor 5

Načítání celých čísel - konverze %i a %d Konverze %i a %d slouží pro načítání celých čísel (do proměnné typu int) Konverze %d předpokládá, že číslo je v desítkové soustavě Konverze %i předpokládá, že číslo je v desítkové, šestnáctkové (začíná-li číslo znaky 0x nebo 0X) nebo osmičkové soustavě (začíná-li číslo nulou) Pokud se před číslem nacházejí mezery, jsou přeskočeny (tj. ignorovány) Šířka nastavuje maximální počet načtených znaků (do toho však nejsou započítány mezery předcházející před číslem) 6

Načítání desetinných čísel - konverze %f Konverze %f slouží pro načítání desetinných čísel (do proměnné typu float) Pokud se před číslem nacházejí mezery, jsou přeskočeny (tj. ignorovány) Šířka nastavuje maximální počet načtených znaků (do toho však nejsou započítány mezery předcházející před číslem) 7

Načítání řetězce - konverze %s Konverze %s slouží pro načítání textového řetězce (do pole typu char []) Tato konverze vynechává všechny počáteční mezery a začne načítat až od prvního znaku který není mezerou; znaky načítá tak dlouho dokud nenarazí na mezeru, pak načítání zastaví (tato mezera se již nenačte) dojde tedy vždy k načtení jednoho slova které je od následujícího odděleno mezerou Před jménem řetězcové proměnné neuvádíme znak & Po načtení znaků je automaticky vložen zakončovací znak \0 Šířka nastavuje maximální počet načtených znaků (do toho však nejsou započítány počáteční mezery) nakonec se však ještě přidá \0 takže pole musí být dostatečně velké aby se do něj vešlo šířka + 1 znaků Šířku téměř vždy uvádíme abychom zamezili překročení mezí pole při načítání (šířka je o 1 menší než velikost pole) char str[10] = ""; // Pole pro retezec scanf("%9s", str); // Nacte max. 9 znaku a na konec vlozi '\0' 8

Formátovaný vstup - konverze %s - příklad Prvni druhe treti slovo // Program nacte vyse uvedeny text ze vstupu char s1[30] = ""; char s2[30] = ""; char s3[30] = ""; char s4[30] = ""; // Pri nacitani se preskakuji pocatecni mezery // Znaky se potom nacitaji tak dlouho, dokud se nenarazi na mezeru scanf("%29s", s1); // Nacte se text: Prvni scanf("%29s", s2); // Nacte se text: druhe scanf("%29s", s3); // Nacte se text: treti scanf("%29s", s4); // Nacte se text: slovo printf("%s, %s, %s, %s\n", s1, s2, s3, s4); // Vypise se: Prvni, druhe, treti, slovo 9

Formátovaný vstup - konverze %c Konverze %c slouží pro načtení znaku (do proměnné typu char) Tato konverze načítá libovolný znak, tedy i mezeru (narozdíl od ostatních konverzí které počáteční mezery vynechávají) Není-li specifikována šířka, načítá se jen jeden znak do proměnné char (před názvem proměnné musí být &) Šířka umožňuje načíst více než jeden znak, načte se tolik znaků kolik je hodnota šířky; znaky se načítají do pole typu char [], pole musí mít dostatečnou velikost (minimálně šířka + 1), před názvem pole neuvádíme & (protože se jedná o pole) POZOR: tato konverze nevloží zakončovací znak \0 (musíme ho tedy vložit sami) char c = ' '; char s[10] = ""; scanf("%c", &c); // Pole znaku // Nacteme znak scanf("%3c", s); // Nacteme 3 znaky; pred nazvem pole neni & s[3] = '\0'; // Vlozime zakoncovaci znak 10

Formátovaný vstup - konverze %[znaky] Konverze %[znaky] načítá sekvenci znaků (do pole typu char []); akceptuje pouze ty znaky, které jsou uvedeny v hranatých závorkách; pokud narazí na znak který v závorkách uvedený není, načítání se zastaví a dále nepokračuje Pokud naopak chceme specifikovat znaky, na nichž se má načítání zastavit, použijeme zápis %[^znaky] kdy budou načítány pouze znaky které nejsou uvedeny v hranatých závorkách (včetně mezer); pokud se narazí na znak který uvedený je, načítání se zastaví a dále nepokračuje Tato konverze nepřeskakuje počáteční mezery Po načtení znaků je vložen zakončovací znak \0 Šířka nastavuje maximální počet načtených znaků, nakonec se však ještě přidá \0 takže pole musí být dostatečně velké aby se do něj vešlo šířka + 1 znaků Šířku uvádíme téměř vždy abychom zamezili překročení mezí pole při načítání (šířka je o 1 menší než velikost pole) 11

236Cstupnu Konverze %[znaky] - příklad // Program nacte vstup uvedeny vyse char s1[30] = ""; char s2[30] = ""; scanf("%29[0123456789c]", s1); printf("cislo na zacatku: %s\n", s1); // Vypise: 236C // Nyni muzeme pokracovat v dalsim nacitani, bude se nacitat // od mista kde jsme naposledy prestali scanf("%29s", s2); printf("dalsi text: %s\n", s2); // Vypise: stupnu mesic=brezen // Program nacte vstup uvedeny vyse char s1[30] = "", s2[30] = "", s3[30] = ""; // Nacitame vse dokud nenarazime na '=' nebo mezeru scanf(" %29[^= ]", s1); // Nacte se: mesic // Nacitame vsechny znaky '=' nebo mezery scanf(" %29[= ]", s2); // Nacte se: = scanf(" %29s", s3); // Nacte se: brezen // Zkracene by se to dalo napsat nasledovne: // scanf("%29[^= ] %29[= ] %29s", s1, s2, s3); 12

Formátovaný vstup příznak * Při načítání dat pomocí formátovacích prvků lze použít formátovací příznak * Tento příznak způsobí, že se daná hodnota načte ale neuloží se do žádné proměnné Tento příznak používáme, pokud některou z hodnot nepotřebujeme zpracovávat, ale musíme ji načíst aby bylo možné načítat hodnoty za ní mesic=brezen // Program nacte vstup uvedeny vyse // Podobny program jako na predchozi strance, ale tentokrat // rovnitko nebudeme ukladat to promenne ale zahodime ho char s1[30] = "", s2[30] = ""; // Nacte se prvni reetzec do promenne s1, // pak se nacte = s pripadnymi mezerami a zahodi se, // nakonec se nacte posledni retezec do promenne s2 scanf(" %29[^= ] %*[= ] %29s", s1, s2); printf("text pred rovnitkem: %s\n", s1); printf("text za rovnitkem: %s\n", s2); // Vypise: mesic // Vypise: brezen 13

Formátovaný vstup - znaky ve formátovacím řetězci Ve formátovacím řetězci funkcí scanf() a fscanf() zpravidla uvádíme pouze formátovací prvky Pokud však v těchto funkcích uvedeme libovolné další znaky musíme je na vstupu zadat přesně jak je uvedeno Pokud funkce narazí na odlišný znak než je uvedeno, načítání bude neúspěšné (zastaví se na tomto znaku) Cislo je 853 // Program nacte vstup uvedeny vyse int a = 0; scanf("cislo je %i", &a); // Pokud se text bude lisit, bude nacteni neuspesne, napr.: scanf("cislo je %i", &i); // Prvni pismeno je male scanf("cislo %i", &i); // Nacte text "Cislo", pak se pokusi // nacist hodnotu ale narazi na znak 'j' coz je neplatne // pro nacitani celych cisel (ocekava se cifra nebo znamenko) scanf("%i", &i); //Pokusi se nacitat cele cislo ale narazi na //znak 'C' coz neni platny znak pro nacitani celeho cisla 14

Formátovaný vstup - mezery ve formátovacím řetězci Mezera ve formátovacím řetězci je interpretována jinak než ostatní znaky Mezera ve formátovacím řetězci představuje libovolný (i nulový) počet mezer na vstupu, které se mají ignorovat (přeskočit) Ve formátovacím řetězci dáváme mezery všude kde předpokládáme, že může uživatel vložit jednu nebo více mezer 1, 2 3, 4 5, 6 7,8 // Program nacte libovolny z vyse uvedenych radku int a = 0, b = 0; scanf("%i, %i", &a, &b); // Nasledujici kod by spravne nacetl jen prvni a posledni radek scanf("%i, %i", &a, &b); 15

Návratová hodnota funkce scanf() Funkce scanf() a fscanf() vrací počet úspěšně načtených a hodnot (nezapočítávají se hodnoty s příznakem *) Návratovou hodnotu využíváme k ověření, zda-li byly správně načteny všechny očekávané hodnoty Návratovou hodnotu lze také využít pokud neznáme přesný počet hodnot, které se na vstupu nacházejí 25 186 39 // Program nacte vyse uvedene hodnoty a vypise jestli // se podarilo uspesne nacist vsechny tri int a = 0, b = 0, c = 0; int n = 0; n = scanf("%i %i %i", &a, &b, &c); if (n == 3) printf("vsechny tri hodnoty byly uspesne nacteny\n"); else printf("bylo nacteno pouze %i hodnot\n", n); 16

Dodržujte následující pravidla Velikost polí specifikujte pomocí symbolické konstanty (definované pomocí #define). Výjimkou jsou řetězcové proměnné, zejména pokud bodou použity pro načítání pomocí funkcí scanf() a fscanf() a bude tedy nutné specifikovat max. počet načtených znaků ve formátovacím řetězci. Hodnoty polí na počátku inicializujte hodnotou 0. Stačí inicializovat první prvek pole, překladač pak všechny ostatní inicializuje 0 Řetězcové proměnné inicializujte prázdným řetězcem Definice proměných opatřete komentářem Při použití scanf() a fscanf() nezapomeňte dát & před název proměnné (i pokud se jedná o prvek pole). Vyjímkou jsou řetězcové proměnné, kde se & nepoužívá. 17

Úlohy část 1 1. Vytvořte program který načte soubor data1.dat (nacházející se v adresáři /home/martinp/c2160/data/). Tento soubor obsahuje data týkající se komplexů HIV-1 proteázy s jejími inhibitory. Soubor obsahuje na každém řádku: PDB kód komplexu, experimentální vazebné energie, spočítané vazebné energie. Program potom vypíše na obrazovku hodnoty energií (nikoliv PDB kód) v opačném pořadí (tj. hodnoty které byly na posledním řádku se zapíší na první řádek). Hodnoty se budou vypisovat s přesností na 2 desetinná místa. 1 bod 2. Úlohu 1 upravte tak, že hodnoty nebudou vypisovány na výstup, ale budou zapisovány do souboru. Hodnoty energií formátujte tak aby byly vypsány s přesností na 2 desetinná místa a desetinné tečky byly zarovnány pod sebou. 1 bod 3. Vytvořte program, který načte soubor obsahující libovolný počet celých čísel oddělených čárkami (počítejte s možností výskytu mezer před a za čárkami). Na konci se vypíše počet těchto hodnot a hodnoty se vypíší v obráceném pořadí. (Nápověda: v cyklu načítejte hodnoty po jedné dokud nenarazíte na konec souboru nebo dokud funkce fscanf() nevrátí 0). 1 bod 12, 13, 14,15, 16, 17 18

Úlohy část 2 4. Vytvořte program, který načte soubor, kde na prvním řádku bude text: "INPUT_FILE = crambin.pdb" a na druhém řádku text: "WINDOW_SIZE: 300, 500". Program načte text před dvojtečkou a rovnítkem do řetězcových proměnných a hodnoty do proměnných integer a jméno do druhé řetězcové proměnné. Program vypíše hodnoty rozměrů a zadané jméno. Počítejte s možností mezer na začátku každého řádku a před nebo po '=' a ','. (Načítání nyní nebude vyžadovat cyklus, pouze zavoláme dvakrát fscanf(), první načte prvnířádek a druhá druhý řádek). INPUT_FILE = crambin.pdb WINDOW_SIZE: 300, 500 1 bod Prvni radek, text pred rovnitkem: INPUT_FILE Prvni radek, text za rovnitkem: crambin.pdb Druhy radek, text pred dvojteckou: WINDOW_SIZE Druhy radek, hodnoty: 300, 500 5. Vytvořte program který načte soubor munbers1.dat a numbers2.dat (nacházející se v adresáři /home/martinp/c2160/data/). Program bude porovnávat hodnoty na jednotlivých řádcích a do jiného souboru zapíše vždy "identical" nebo "different". nepovinná, 2 body 36 5 21 174 94 86 23 15 36 50 21 174 125 78 23 15 identical different identical identical different different identical identical 19