Uživatelské nástroje

Nástroje pro tento web


pitel:izp:proj4

Ř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
/var/www/wiki/data/pages/pitel/izp/proj4.txt · Poslední úprava: 30. 12. 2022, 13.43:01 autor: 127.0.0.1