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(...)