C-keele reavahetus: põhjalik juhend printf ja failiväljundi näidetega

1. Sissejuhatus

C-keele reavahetuse olulisus

C-keeles programmeerimisel on reavahetus hädavajalik koodi loetavuse ja väljundi vormindamise seisukohalt. Eriti oluline on see konsooli väljundi ja tekstifailide kirjutamisel—kui reavahetust õigesti ei kasutata, võib programm käituda ootamatult. Selles artiklis selgitatakse C-keele reavahetuse põhitõdesid ja edasijõudnutele mõeldud kasutusvõimalusi koos konkreetsete koodinäidetega.

2. Reavahetuse põhitõed C-keeles

2.1 Põhiline reavahetus \n kasutades

C-keeles on kõige lihtsam viis reavahetuse tegemiseks kasutada printf funktsioonis \n (newline) erimärki. \n on erisümbol, mis lisab uue rea sinna, kuhu see koodis paigutatakse.

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    printf("Õpime tundma C-keele reavahetust.\n");
    return 0;
}

Selles näites kuvatakse Hello, World! ja Õpime tundma C-keele reavahetust. eraldi ridadel.

Väljund:

Hello, World!
Õpime tundma C-keele reavahetust.

2.2 Erimärkide ülevaade

\n on üks paljudest erimärkidest. Näiteks \t lisab tabulaatori, \\ tähistab kaldkriipsu. Erimärke kasutatakse stringides spetsiaalsete toimingute tegemiseks, kuid reavahetuse puhul kasutatakse kõige sagedamini just \n-i.

侍エンジニア塾

3. Reavahetuskoodi erinevused platvormiti

3.1 Erinevate keskkondade reavahetuskoodid

Oluline on teada, et eri platvormidel kasutatakse erinevaid reavahetuskoode. Näiteks Windowsis kasutatakse kombinatsiooni carriage return (CR) ja line feed (LF), ehk \r\n. Unix/Linux ja MacOS-is kasutatakse ainult line feed’i (\n).

PlatvormReavahetuse kood
Windows\r\n
Unix/Linux\n
MacOS\n

3.2 Platvormideülene ühilduvus

Erinevatel platvormidel programme käivitades tuleb olla tähelepanelik reavahetuskoodide erinevuste suhtes. Näiteks kui avada Windowsis loodud tekstifail Linuxis, võib ilmuda liigne \r märk. Selle vältimiseks saab faile avada binaarrežiimis või kasutada tööriistu nagu dos2unix, et reavahetuskoode teisendada.

4. Edasijõudnud reavahetuse kasutamine

4.1 Reavahetus failides fputs ja fprintf abil

Lisaks printf-ile saab reavahetust kontrollida ka fputs ja fprintf abil, mis sobivad eriti hästi failidesse kirjutamisel.

#include <stdio.h>

int main() {
    FILE *fp = fopen("output.txt", "w");
    if (fp != NULL) {
        fprintf(fp, "Faili kirjutatav tekst\n");
        fputs("Ka see tekst kirjutatakse faili.\n", fp);
        fclose(fp);
    }
    return 0;
}

Selles näites kirjutatakse faili output.txt kaks rida teksti.

output.txt sisu:

Faili kirjutatav tekst
Ka see tekst kirjutatakse faili.

4.2 Vormindatud väljundi reavahetus

Reavahetust sisaldavate vormindajatega saab väljundit paindlikumalt kontrollida—näiteks mitu andmerida järjestikku väljundisse kirjutades.

#include <stdio.h>

int main() {
    int a = 10, b = 20;
    printf("Väärtus a: %d\nVäärtus b: %d\n", a, b);
    return 0;
}

Väljund:

Väärtus a: 10
Väärtus b: 20

5. Levinumad vead ja tõrkeotsing

5.1 \n vale kasutamine

Algajad teevad tihti vea, püüdes kasutada \n-i väljaspool stringi. Näiteks järgmine kood annab kompileerimisvea:

printf(\n"Reavahetuse test\n");

Sest \n töötab ainult stringi sees. Õige viis on järgmine:

printf("\nReavahetuse test\n");

5.2 Silumisnõuanded

Kui reavahetusega seotud probleem ilmneb, kontrolli kindlasti väljundit. Samuti on kasulik kasutada silurit (debugger), et jälgida iga sammu väljundit. Eriti erinevatel platvormidel tuleb reavahetuskoode tähele panna.

6. Praktilised näited ja rakendused

6.1 Keerukamate väljundite vormindamine

Reavahetuse abil saab luua selgema ja arusaadavama koodi ning soovitud väljundi. See on eriti kasulik tabelite kuvamisel.

#include <stdio.h>

int main() {
    printf("ID\tNimi\tTulemus\n");
    printf("1\tAlice\t85\n");
    printf("2\tBob\t90\n");
    printf("3\tCharlie\t95\n");
    return 0;
}

Väljund:

ID  Nimi    Tulemus
1   Alice   85
2   Bob     90
3   Charlie 95

6.2 Failikirjutamine koos reavahetusega

Kui kirjutad tekstifaili andmeid koos reavahetusega, on andmete eristamine lihtsam. Näiteks logifailis saab iga sissekande eraldi reale kirjutada, muutes logi hilisema lugemise arusaadavamaks.

#include <stdio.h>

int main() {
    FILE *logFile = fopen("log.txt", "a");
    if (logFile != NULL) {
        fprintf(logFile, "Programm lõpetas edukalt.\n");
        fclose(logFile);
    }
    return 0;
}

log.txt sisu:

Programm lõpetas edukalt.

7. Kokkuvõte

Olulisemate punktide kordamine

Selles artiklis käsitlesime C-keele reavahetuse põhitõdesid ja edasijõudnutele mõeldud kasutusvõimalusi: printf-i kasutamist, reavahetuskoodide erinevusi eri platvormidel, edasijõudnud väljundivormingut ning levinumaid vigu ja lahendusi.

Järgmised sammud

Nüüd, kui mõistad C-keele reavahetust, võid proovida ka muid stringi töötlemise ja sisendi/väljundiga seotud funktsioone, et luua keerukamaid väljundeid ja parandada oma programmide kasutajasõbralikkust.

8. KKK

K1: Kuidas teha C-keeles kaks järjestikust reavahetust?

V: Kaks järjestikust reavahetust saad teha, kui kasutad \n-i kaks korda järjest. Näiteks: printf("Hello\n\nWorld\n"); lisab “Hello” ja “World” vahele tühja rea.

Koodinäide:

#include <stdio.h>

int main() {
    printf("Hello\n\nWorld\n");
    return 0;
}

Väljund:

Hello

World

K2: Kas reavahetuskoodide erinevus võib põhjustada programmi mittetöötamist?

V: Jah, eriti failide lugemisel ja kirjutamisel võivad erinevad reavahetuskoodid probleeme tekitada. Näiteks kui liigutad Windowsis loodud faili Unix/Linuxi, võib '\r' ilmuda tavalise tähemärgina või reavahetust ei toimu õigesti. Selle vältimiseks ava fail binaarrežiimis või teisenda koodid tööriistaga dos2unix.

K3: Kas peale \n on muid reavahetuse viise?

V: C-keeles on standardne viis reavahetuse tegemiseks \n. Kuid puts funktsioon lisab automaatselt iga stringi lõppu reavahetuse.

#include <stdio.h>

int main() {
    puts("Hello, World!"); // puts lisab automaatselt reavahetuse
    return 0;
}

Väljund:

Hello, World!

9. Viited ja lingid

  • C-keele ametlik dokumentatsioon: C-keele spetsifikatsiooni ja standardraamatukogu kohta leiad rohkem infot ISO/IEC 9899:2018 ametlikust dokumentatsioonist.
  • Koodiredaktorite seadistused: Näiteks Visual Studio Code või Atom võimaldavad muuta reavahetuse seadeid. Vaata oma redaktori dokumentatsioonist, kuidas platvormile sobiv reavahetus valida.
侍エンジニア塾