Interaktívna osnova pre IB001/10 a IB001/11

Týden 11

Prebrali sme:

  • práca s textovými súbormi, vstup a výstup

Príklady

  • počet znakov z veľkej abecedy vo vstupnom súbore a ich zápis do výstupného súboru

int pocet=0;

FILE *fr = fopen("vstup.txt", "r");

if (fr==NULL) {printf("Subor vstup.txt sa nepodarilo otvorit\n"); exit(1);}

FILE *fw = fopen("vystup.txt", "w");

if (fw==NULL)

{

  //zatvorime otvoreny subor fr

  fclose(fr);

  printf("Nepodarilo sa vytvorit/otvorit subor vystup.txt\n"); exit(1);

}

char c;

while ((c=getc(fr))!=EOF) //nacitavame znak z fr kym nie je end-of-file

{

  if (c>='A' && c<= 'Z')

  {pocet++; putc(c, fw);}

}

fclose(fr); fclose(fw);

 

  • počet slov v súbore pomocou funkcie int kolkoSlov(const char * retazec) z predošlého týždňa

int pocet;

FILE *f = fopen("vstup.txt", "r");

char* riadok = (char *) malloc(100*sizeof(char));

while((fgets(riadok, 100, f))!=NULL)

{

pocet+=kolkoSlov(riadok); //spocitame slova v riadku

}

free(riadok);

fclose(f);

 

  • priraďovanie a porovnávanie reťazcov

char* r1 = (char*) malloc(4*sizeof(char)); r1[0] = 'a'; r1[1] = 'b'; r1[2] = 'c'; r1[3]='\0';

char* r2 = "abc";

printf("ukazuju tie dva pointre na rovnake miesto v pamati?\n");

if (r1==r2)

  printf("ano\n\n");

else printf("nie\n\n");

 

printf("su tie dva retazce obsahovo rovnake?\n");

if (strcmp(r1,r2)==0)

  printf("ano\n\n");

else printf("nie\n\n");

 

  • načítanie riadkov vstupného súboru, ich úprava pomocou funkcie char* trim(char* retazec), ktora odstrani nadbytocne biele znaky, a zapísanie upravených riadkov do výstupného súboru

 

FILE *fr = fopen("vstup.txt", "r");

FILE *fw = fopen("vystup.txt", "w");

char* riadok = (char *) malloc(100*sizeof(char));

while((fgets(riadok, 100, fr))!=NULL)

{

char* upravenyRiadok = trim(riadok);

fputs(upravenyRiadok, fw); //zapis upraveneho riadku

free(upravenyRiadok);

}

free(riadok);

fclose(fr); fclose(fw);

 

  • načítanie matice 9x9

FILE *f = fopen("vstup.txt", "r");

int matica[9][9];

for (int i=0; i<9; i++)

{

  for (int j=0; j<9; j++)

     fscanf(f, "%d", &(matica[i][j])); //funkcii scanf a fscanf nezalezi na medzerach alebo prazdnych riadkoch, maticu by spravne nacitalo aj kebyze zadate kazde cislo na novy riadok, aj kebyze mate 81 cisel v jednom riadku, aj ked ich budete mat pekne napisane v matici

}

Chyba: Odkazovaný objekt neexistuje nebo nemáte právo jej číst.
https://is.muni.cz/el/1433/podzim2012/IB001/cviceni/36324090/input.txt
Chyba: Odkazovaný objekt neexistuje nebo nemáte právo jej číst.
https://is.muni.cz/el/1433/podzim2012/IB001/cviceni/36324090/du4.pdf