V textovom súbore je n rodných čísiel. Pre každé z nich zistite, či je mužské alebo ženské.
Riešenie 1
Rodné číslo budeme považovať za desaťznakový reťazec, teda za 11 znakové pole (10 znakov + \0
znak na konci). Zjednodušíme si zadanie: prvý riadok v súbore bude obsahovať počet záznamov, aby sme s výhodou použili cyklus for
.
3
1212211234
6851184321
7801011111
Dáta budeme načítavať pomocou fscanf()
, pričom nezabudneme uviesť veľkosť buffra.
Po spustení pozorujme správanie sa pri nekorektných vstupoch (príliš dlhé rodné číslo.)
#include <stdio.h>
void vypis_pohlavie(char rodne_cislo[]) {
if(rodne_cislo[2] == '5' || rodne_cislo[2] =='6') {
printf("Zenske rodne cislo: %s\n", rodne_cislo);
} else {
printf("Muzske rodne cislo: %s\n", rodne_cislo);
}
}
int main(void)
{
FILE * subor;
int pocet_riadkov;
int i = 0;
char rodne_cislo[11];
subor = fopen("C:\\temp\\rodnecisla.txt", "r");
if(subor == NULL) {
perror("Subor sa nepodarilo otvorit");
return 1;
}
fscanf(subor, "%d", &pocet_riadkov);
for(i = 0; i < pocet_riadkov; i++) {
fscanf(subor, "%10s", rodne_cislo);
vypis_pohlavie(rodne_cislo);
}
fclose(subor);
return 0;
}
Pozorujme situáciu, keď je funkcia uvedená za funkciou, ktorá ju používa. Objasnime si použitie funkčných prototypov.
#include <stdio.h>
void vypis_pohlavie(char rodne_cislo[]);
int main(void) {
/* ... */
vypis_pohlavie(rodne_cislo);
/* ... */
}
void vypis_pohlavie(char rodne_cislo[]) {
if(rodne_cislo[2] == '5' || rodne_cislo[2] =='6') {
printf("Zenske rodne cislo: %s\n", rodne_cislo);
} else {
printf("Muzske rodne cislo: %s\n", rodne_cislo);
}
}
Možnosť č. 2
Namiesto fscanf()
použime robustnejšiu fgets()
, opäť s prihliadnutím na dĺžku buffera. V tomto prípade si vystačíme s bežným obsahom súboru:
1212211234
6851184321
7801011111
Údaj o počte prvkov už nepotrebujeme.
int main(void) {
while(1) {
if(fgets(rodne_cislo, 11, subor) == NULL) {
break;
}
vypis_pohlavie(rodne_cislo);
}
}