FizWeb

Porkoláb Zoltán - C programozás 2017.11.27. előadás jegyzet

9. előadás: Main függvény paraméterei, Input/output, filekezelés, stringkezelés, egyéb szabványos könyvtári elemek.

BEOLVASÁS, ÍRÁS:

int main(int argc, char const *argv[]) { //(const),  **argv
  /* code */
  return 0;
}


$./a.out par1 par2 par3
par3 par2 par1
$

HOME=...\0
PATH=...\0
...
NULL

VIGYÁZZ!!
mindig ellenőrizni, hogy argv[i]-ben i0) {
    printf("%s\n", argv[i]);
    if (i>1) prinf(" ");
    --i;
  }
  return 0;
}

Mi van, ha a felhasználó nem megfelelő fájlnevet ad meg?


Mi van, ha a felhasználó nem ad meg fájlnevet?
ált. pipeline-on olvas a standard inputról

pl.
cat file | countws | ...


Whitespace számláló program:

#include 
#include   //ebben van ws felismerő macro (" ", "\t", "\n") -> lehetne ilyet írni is

//void count()
int count(FILE *fp);

int main(int argc, char **argv) {
  int sumws = 0;
  int i = 1;
  while (i < argc) {
    FILE *fp = fopen(argv[i],"r");
    if (NULL == fp) {  //if cannot open file
      fprintf(stderr, "Can't open file: %s\n", argv[i]);   //fprintf a stderr outputjára ír, a printf az értékes outputot a stdoutra (képernyőre, vagy pipe-ra)
    }
    else{
      sumws += count(fp);
    }
  }
  return 0;
}


//ha nincs megadva fájl, olvasson a standard inputról:
int main(int argc, char const *argv[]) {
  int sumws = 0;
  if (1 == argc) {
    sumws += count(stdin);
  }
  else{
  int i;
  FILE *fp;
  for (i = 1; i < argc; ++i) {
    if (NULL == (fp = fopen(argv[i], "r"))) {
      fprintf(stderr, "Can't open file: %s\n", argv[i]);
    }
    else{
      sumws += count(fp);
    }
  }

  }
  return 0;
}

//és a count függvény:

int count(FILE *fp){
  int cnt=0;
  int ch;
  while (EOF != (ch=fgetc(fp))) { //vagy fgetf
    if(isspace(ch)) ++cnt;  /* cnt += isspace(ch); */
  }
  return cnt;
}

//fopen: le kell zárni, különben: max megnyitható overflow
//r, r+, w, w+, a, a+

FILE *fp = fopen(char *fname, "r+")
int fclose(FILE *fp);

//keresés:
fseek(FILE *fp, long off, int x) //int x: 0,1,2

//hol vagyok?
ftell(file *fp)

int fgetc(file *fp)

int fputc(int ch, file *fp)

int feof(fp)  //hol a fájl vége?

/*szavanként, soronként? --> igazából ez az egész egy hosszú karakterlánc
De azért lehet :) */
int fscanf (FILE *fp, char)

Pl.:
fscanf(stdin, "%3d %d", &i, &j); //returns with: number of scanned chs
//veszélyes verzió:
fscanf(stdin, "%s", b) //--> lehet hosszabb az input, mint a b: felülírja a memóriát!! buffer overflow
//sok környezetben csak biztonságos változat:
fscant_s(...)


fgets(buffer, &a, fp);
fputs(buffer, fp);    //itt nem kell megmondanom h hény karaktert olvasok be

//rewind()  --> visszagörget
//rename()  --> átnevez

ezek mind: formattált beolvasás: binárisat karakterenként
Ha bináris fájlt binárisan szeretnék beolvasni:

fread(char *buffer, int i, int s, FILE *fp)
//fp-ből s byteméretű i db fájl beolvasása
//bufferben legalább i*s char fér el
fwrite(...)