SYÖTTÖ NÄPPÄIMISTÖLTÄ JA TULOSTUS NÄYTÖLLE
C-kielen i/o-funktiot hyödyntävät puskureita, jolloin näppäilty syötön tulos varastoidaan tilapäiseen muistialueeseen, näppäimistöpuskuriin. Kun koko teksti on syötetty painetaan Enter-näppintä, jolloin merkkilohko tulee input-rutiinin hoidettavaksi. Merkkejä ei lähetetä input-rutiinille ennenkuin Enter-näppäintä on painettu. Puskuroidun syötön etuna on mahdollisuus korjata väärinsyötettyjä merkkejä. On mahdollista käyttää myös puskuroimatonta syöttöä, jolloin merkit näytetään heti näppäilyn jälkeen. Puskuroimaton syöttö soveltuu reaaliaikaisiin sovelluksiin sekä sovelluksiin, jotka ovat vuorovaikutuksessa käyttäjään.
PUSKUROITU MERKKI I/O
Yksittäisiä merkkejä voidaan lukea käyttämällä funktiota getchar(). getchar()-funktio palauttaa yksittäisen merkin standardilta syöttölaitteelta. Funktio ei vaadi mitään argumentteja mutta sulkuparin tulee sisältyä funktion nimeen sitä kutsuttaessa.getchar()-funktion yleinen muoto:
getchar-funktio lukee standardisyöttölaitteelta ja palauttaa arvon vasta Enter-näppäimen painamisen jälkeen.merkki_muuttuja = getchar();
Merkin lukemisen getchar-funktion vastakkainen toiminto on putchar()-funktio, joka näyttää yksittäisen merkin näytöllä.char ch; /* ch-niminen merkkimuuttuja */ ch = getchar(); /* luetaan merkki ch-muuttujaan */
putchar()-funktion yleinen muoto:
putchar(merkki_muuttuja); char ch = 'X'; putchar(ch); /* näytetään muuttuja */
Esimerkki (alla), ohjelma odottaa että käyttäjä antaan jonkin merkin näppäimistöltä, annettu merkki näytetään näytöllä.
/* merkkimuutujan syöttö ja tulostus */ #include <stdio.h> int main() { char ch; ch = getchar(); putchar(ch); getch(); return 0; }
PUSKUROIMATON MERKKI I/O
getch()-funktio lukee merkin näppäimistöltä puskuroimatta sitä. Syötettyä merkki ei myöskään näytetä näytöllä. Mikäli syötetty merkki halutaan näyttää näytöllä on käytettävä getche()-funktiota ( e tarkoittaa echo).getch()-funktion yleinen muoto:
taimerkki_muuttuja = getch();
merkki_muuttuja = getche(); char ch; ch = getch(); ch = getche();
STREAMS
C käyttää virtoja (streams) esittämään tietoa, joka siirtyy ohjelman suhteen sisään tai ulos. Virrat mahdollistavat tietokoneen I/O-laitteiden käytön ilman, että tarvitsee huolehtia tietokoneen alemman tason ohjauksesta. Virtoja käytetään kaikentyyppisten I/O-toimintojen yhteydessä mukaan lukien tiedostojen käsittelyt. Virtoja käyttämällä koodi on myös siirrettävissä muihin tietokoneympäristöihin.Standardivirrat:
Funktio | Kuvaus | Laite |
---|---|---|
stdin | syöttövirta | näppäimistö |
stdout | tulostusvirta | näyttö |
stdprn | tulostusvirta | rinnakkaisportti |
stdaux | oheislaitetulostus | sarjaportti |
stderr | virhevirta | näyttö |
Standardivirtojen käyttö on helppoa, koska niitä ei tarvitse esim. avata erikseen vaan C avaa ne automaattisesti niin, että ne ovat käytettävissä ohjelmaa suoritettaessa.
printf ( ) ja scanf ( ) FUNKTIOT
Molemmat funktiot käsittelevät muotoiltavaa tietoa. printf()-funktio esittää tiedon käyttäjälle ja scanf()-funktio saa syöttötiedon käyttäjältä. Funktiot toimivat C:n perustietotyyppien kanssa. printf()-funktio koostuu kahdesta osasta: muotoilujonosta ja muuttuja-listasta. Muotoilujono määrittää sen, minkä tyyppistä tietoa tulostetaan. Tämä tieto saadaan muuttuja-listasta.printf()-funktion yleinen muoto:
printf(”muotoilujono”,muuttuja_1, muuttuja_2);
Ohjausjono on merkkijono, joka sisältää muotoilussa tarvittavan informaation ja arg1, arg2, ... , argn kuvaavat argumentteja. Argumentit voidaan kirjoittaa vakioina, yksittäisinä muuttujan niminä tai monimutkaisempina ilmauksina.
int x = 99; printf(”Tulostaa merkkijonon\n”); printf(”Kokonaisluku on %d\n”, 123); printf(”Kokonaislukumuuttuja on %d\n”, x);
printf()-funktion muotoilumääritteet:
Määrite | Tulostystyyppi | Esimerkki |
---|---|---|
%d | Etumerkillinen kokonaisluku | printf("Luku = %d", numero1); |
%i | Etumerkillinen kokonaisluku | printf("Tulos = %i", tulos); |
%f | Desimaaliluku (liukuluku) | printf("Keskiarvo = %f", keski_arvo); |
%e | Desimaaliluku, exponettimuodossa | printf("Miljardi %e", isoluku); |
%x | Etumerkitön heksaluku | printf("N\x084yt\x084 tulos:"); |
%o | Etumerkitön oktaaliluku | |
%c | merkki | printf("Valitsit %c", valittu); |
%s | merkkijono | printf("Etunimesi %s", nimitaulukko); |
Ohjausjonossa voidaan käyttää erikoismerkkejä (escape-merkit) ohjaamaan tulostusta. Nämä merkit mahdollistavat sellaisten merkkien tulostamisen, jotka eivät ole näppäimistöllä.
Merkkijonoissa käytettävät erikoismerkit:
Koodi | Selite |
---|---|
\a | äänimerkki |
\b | "Backspace" eli askelpalautin, vastaa toiminnaltaan ko painikkeen painallusta (Enter-painikkeen yläpuolella) |
\r | "vaununpalautus", kursorin siirtäminen rivin lopusta rivin alkuun |
\" | Lainausmerkki |
\f | "Sivunsyöttö", siirtää kursorin "toiselle sivulle" |
\n | Rivinvaihto |
\0 | Null-arvo |
\' | Heittomerrki |
\t | Vaakasarkain, siirtää kursoria oikealla |
\v | Pystysarkain, siirtää kursoria alas |
\\ | Kenoviiva |
ooo | Ascii-merkki oktaalinuodossa |
\x### | Hex-muotoinen merkki |
\? | Kysymysmerkki |
Esimerkki (alla) ohjelma tulostaa näytölle tekstin käyttäen heksalukuja.
/* tulostus heksalukujen avulla */ #include <stdio.h> int main() { printf(”\x048\x065\x06c\x06c\x06f\x02c\x020”); printf(”\x057\x06f\x072\x06c\x064\x021\n”); getch(); return 0; }
Esimerkissä (alla) float-tyyppiset tulosteet näytölle on muotoiltu näyttämään tuloksen kahdella desimaalilla ( %.2f ).
/* ohjelma muuttaa tuumat senttimetreiksi */ #include <stdio.h> int main() { float tuumat, sentit; /* muuttujien määrittely */ printf(”Anna tuumat\n”); scanf(”%f”, &tuumat); sentit = tuumat * 2.54; printf(”%.2f tuumaa on %.2f cm\n”, tuumat, sentit); getch(); return 0; }
Esimerkissä (alla) tulostuksia määrätyn mittaisiin kenttiin.
/* kentänleveyden määritys hakasulkeet osoittavat kentän alku- ja loppukohdan */ #include <stdio.h> int main() { const int kentta = 768; printf(”[%d]\n”, kentta); printf(”[%3d]\n”, kentta); printf(”[%5d]\n”, kentta); printf(”[%13d]\n”, kentta); getch(); return 0; }
scanf()-funktion yleinen muoto:
Ohjausmerkkit sisältää muotoilussa tarvittavaa tietoa ja muuttuja_1, muuttuja_2,... , muuttuja_n ovat argumentteja(muuttujien nimiä), jotka esittävät yksilöllisiä tietoalkioita. Todellisuudessa argumentit ovat osoittimia, jotka osoittavat tietoalkioiden osoitteisiin tietokoneen muistissa.scanf("ohjausmerkit",muuttuja_1, muuttuja_2);
scanf()-funktion käyttö on esimerkki puskuroidusta syötöstä. Käyttäjän on painettava Enter-näppäintä tietojen syötön jälkeen.int x; scanf(”%d”, &x);
scanf() -muunnoskoodit:
Koodi | Selite |
---|---|
%c | char, yksittäinen merkki |
%d | int, etumerkillinen kokonaisluku |
%i | int, kokonaisluku |
%e | float, liukuluku eksponenttimuodossa |
%f | float, liukuluku (desimaaliluku) |
%lf | double, liukukuku (desimaaliluku) |
%h | short, kokonaisluku |
%o | oktaaliluku |
%s | char, merkkijono |
%u | unsigned, etumerkitön kokonaisluku |
%lu | unsigned long |
%x | heksadesimaaliluku |
Esimerkissä (alla) ohjelma pyytää osan nimen, osanumeron ja osan hinnan, sekä tulostaa annetut näytölle.
/* tietojen syöttö */ #include <stdio.h> int main() { char nimi[20]; int osa; float hinta; printf("Anna nimi, osanumero ja hinta\n"); scanf("%s %d %f", &nimi, &osa, &hinta); printf("Nimi on: %s\nOsanumero on: %d\nHinta on: %.2f\n e", nimi, osa, hinta); getch(); return 0; }
MERKKIJONOJEN I/O -FUNKTIOT
Funktiot gets() ja puts() mahdollistavat merkkijonojen siirron tietokoneen ja standardilaitteiden välillä. Kumpikin funktio käyttää yhtä argumenttia, jonka tulee olla merkkijono. Funktiot tarjoavat vaihtoehdon funktioiden scanf() ja printf() käyttämiselle merkkijonojen lukemiseen ja tulostamiseen.Yleinen muoto funktioille:
jagets(merkkijono)
Merkkijono voi esittää mitä tahansa merkkijonomuuttujaa.puts(merkkijono)
Esimerkki (alla).char teksti[255]; char viesti[] = ” Tämä on viesti”; gets(teksti); /* käyttäjä syöttää merkkijonon */ puts(viesti); puts(teksti);
/* merkkijonon lukeminen */ #include <stdio.h> int main() { char teksti[255]; char viesti[] = ” Lopuksi testiteksti ”; puts(”Anna tekstirivi\n”); gets(teksti); puts(”\n\nAntamasi teksti oli: ”); puts(teksti); puts(viesti); getch(); return 0; }