Řazení
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct osoba {
char jmeno[21];
char prijmeni[21];
char pohlavi;
unsigned int rok;
} OSOBA;
OSOBA *nacti (char *soubor) {
//Otevreni souboru
FILE *fp;
if ((fp=fopen(soubor,"r"))==NULL) { //kdyz se nepovede
fprintf(stderr,"Nepodarilo se otevrit soubor.\n");
return NULL;
}
//Nacitani & parsovani csv souboru
int znak;
int radky=0;
int polozka=1;
char buffer[21];
int pismeno=0;
OSOBA *seznam=malloc(radky+1*sizeof(OSOBA)); //naalokujeme prvni polozku
int alokovano=1;
while ((znak = getc(fp)) != EOF) { //cteme ze streamu souboru
// printf("%c",znak);
//Novy radek
if (znak=='\n') {
if (polozka!=4) { //meli bysme mit 4 polozky
fprintf(stderr,"Neplatny csv soubor.\n");
fclose(fp);
free(seznam);
return NULL;
}
seznam[radky].rok=atoi(buffer); //a kdyz je mame, tak ulozime rok
radky++; //skocime na dalsi radek
if (alokovano<=radky) {
alokovano+=32;
if ((seznam=realloc(seznam,alokovano*sizeof(OSOBA)))==NULL) { //prialokujeme dalsi prvek
fprintf(stderr,"Realloc se nepovedl.\n");
fclose(fp);
free(seznam);
return NULL;
}
}
polozka=1;
pismeno=0;
continue; //cti dalsi znak
}
//Nova polozka
if (znak==';') { //oddelovac polozek, zjistime kde jsme, a ulozime do seznamu
if (polozka==1) strcpy(seznam[radky].jmeno,buffer);
if (polozka==2) strcpy(seznam[radky].prijmeni,buffer);
polozka++; //skocime na dalsi polozku
pismeno=0; //vynulujeme vsechno mozny
// printf ("%s\n", buffer);
continue; //cti dalsi znak
}
//Jmeno & prijmeni
if (polozka==1 || polozka==2) {
buffer[pismeno]=znak;
buffer[pismeno+1]='\0';
// printf ("%s\n", buffer);
pismeno++;
}
//Pohlavi
if (polozka==3) {
seznam[radky].pohlavi=znak;
}
//Rok
if (polozka==4) {
buffer[pismeno]=znak;
buffer[pismeno+1]='\0';
pismeno++;
}
}
//Prazdny soubor
if (radky==0) {
fprintf(stderr,"Prazdny soubor.\n");
fclose(fp);
free(seznam);
return NULL;
}
//printf("Radku: %d\n", radky);
fclose(fp);
//strcpy(seznam[1].jmeno,"Pepa");
return seznam;
}
void tuxmas() {
printf ("\nAno pane asistente, mohl jsme Vam dat setrideny seznam, i do souboru jsem ho\n");
printf ("mohl zapsat. Ale pred Vanoci jsem byl prilis liny, a tak zustala jen csv ctecka,\n");
printf ("ale krasna!\n");
printf ("\nMerry tuxmas & happy GNU year! :)\n");
}
void napoveda(void) {
printf("Program pro razeni csv seznamu jmen.\n\n");
printf("POUZITI:\n");
printf("./proj4 -key=123 vstup vystup\n\n");
printf("-key= nasleduji cisla sloupcu v poradi jak se maji seradit\n");
printf("vstup vstupni csv soubor\n");
printf("vystup vystupni soubor\n");
printf("\nSepsal a v hlavni rohli sehral xkalab00.\n");
}
int main(int argc, char *argv[]) {
if (argc == 1 || (argc == 2 && strcmp("-h", argv[1]) == 0)) {
napoveda();
return EXIT_SUCCESS;
}
if (argc>=2) {
//Klic
char *klic=strstr(argv[1],"-key=");
if (klic==NULL) {
fprintf(stderr,"Spatny klic!\n");
return EXIT_FAILURE;
}
klic+=5;
printf ("Klic je %s.\n\n",klic);
//Nacteni seznamu
OSOBA *seznam=nacti(argv[2]);
if (seznam==NULL) {
return EXIT_FAILURE;
}
unsigned int x;
for (x=0; x<=10; x++) printf("%s %s %c %d\n",seznam[x].jmeno, seznam[x].prijmeni, seznam[x].pohlavi, seznam[x].rok);
free(seznam);
tuxmas();
}
return EXIT_SUCCESS;
}
//gcc -std=c99 -Wall -W -pedantic proj4.c -o proj4 -O2