#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