kommando > outfile | lenkt Ausgabe von kommando in File outfile |
kommando < infile | erwartet Eingabe für kommando im File infile |
komm1 | komm2 | Ausgabe von komm1 wird Eingabe von komm2 (Pipe) |
BEISPIELE/b333a.c: #include <stdio.h> #define FILENAME "abcd" main() /* fopen / fclose */ { FILE *fpr; fpr=fopen(FILENAME,"w"); if(fpr == NULL) { perror("fopen"); /* Reaktion auf Fehler */ } fprintf(stderr,"Datei \"abcd\" wird angelegt\n"); fprintf(fpr,"Dieser TEXT wird ins File mit dem \n"); fprintf(fpr,"Namen %s geschrieben\n",FILENAME); if((fclose(fpr)) != 0) { perror("fclose"); /* Reaktion auf Fehler */ } } |
VERBATIM/b333a: #include <stdio.h> FILE *fopen(filename, type) char *filename, *type; |
``r`` | lesen |
``w`` | (über-)schreiben bzw. erzeugen |
``a`` | anfügen bzw. erzeugen |
``r+`` | update, d.h. lesen und schreiben |
``w+`` | update, wenn File existiert --> löschen |
``a+`` | update, wenn File existiert --> fortschreiben |
VERBATIM/b333b: #include <stdio.h> void perror(s) const char *s; |
VERBATIM/b333c: #include <stdio.h> int fclose(stream); FILE *stream; |
VERBATIM/b333d: include <stdio.h> int fwrite(ptr, size, nitems, stream) char *ptr; int size, nitems; FILE *stream; |
FILE *fpt; ... struct p { char name[20]; char vorname[20]; int geb_jahr; char geschlecht; char anschrift[70]; } person; ... i=fwrite(&person,sizeof(struct p),1,fpt); ...
VERBATIM/b333e: include <stdio.h> int putc(c, fpr) int c; FILE *fpr; |
VERBATIM/b333f: include <stdio.h> int getc(fpr) FILE *fpr; |
BEISPIELE/b333b.c: #include <stdio.h> main() /* Filekopieren mit Filedescriptor */ { void filecopy(); filecopy(stdin,stdout); } void filecopy(ifp, ofp) FILE *ifp, *ofp; { int c; while((c=getc(ifp)) != EOF) putc(c,ofp); } |
Bibliotheksfunktion: fgets
VERBATIM/b333g: #include <stdio.h> char *fgets(s,n,fpr) char *s; int n; FILE *fpr; |
BEISPIELE/b333c.c: #include <stdio.h> main() /* Zeilen lesen, mit Laengenangabe ausgeben */ { char zeile[80]; int i; while((i=getline(zeile,80)) != 0) printf("%2d %s\n",i,zeile); } int getline(line, max) /* eine Zeile lesen, Laenge liefern */ int max; char *line; { if((fgets(line,max,stdin)) == NULL) return 0; return(strlen(line)); } |
BEISPIELE/b333d.c: /* Kopieren von Files zur Standardausgabe; Argumente sind Filenamen oder - fuer Standardeingabe */ #include <stdio.h> #define MAX 512 main(argc, argv) char **argv; { void copy(); register char **argp; register FILE *file; if (argc == 1) copy (stdin); else { argp=argv; while (--argc > 0) if ((*++argp)[0] == '-' && (*argp)[1]== '\0') copy(stdin); else if ((file = fopen(*argp, "r")) != NULL) { copy(file); fclose(file); } else fprintf(stderr, "%s: can't open %s\n", *argv, *argp); } } void copy(file) FILE *file; { char zf[MAX]; while ((fgets(zf,MAX,file)) != NULL) fputs(zf,stdout); } |
VERBATIM/b333h: #include <stdio.h> int fseek(fpr,offset,origin) FILE *fpr; long offset; int origin; |
SEEK_SET = Dateianfang SEEK_CUR = aktuelle Position SEEK_END = Dateiende
int lies_satz(i) int i; { FILE *fp; if((fp=fopen(...,"r")) == NULL) {/* Fehlerbehandlung */} i--; if((fseek(fp,(long)i*sizeof(struct p),SEEK_SET)) == -1) { /* Fehlerbehanulung */ } if((fread(&person,sizeof(struct p),1,fp)) == 0) { /* Fehlerbehanulung */ } fclose(fp); }Bibliotheksfunktionen: stat, fstat
VERBATIM/b333i: #include <sys/types.h> #include <sys/stat.h> int stat(filename,status) char *filename; struct stat *status; int fstat(fd, status) int fd; struct stat *status; |
VERBATIM/b333j: /* Status einer Datei beschreiben */ struct stat { dev_t st_dev; ino_t st_ino; mode_t st_mode; short st_nlink; uid_t st_uid; gid_t st_gid; .... off_t st_size; .... time_t st_mtime; .... }; |
BEISPIELE/b333e.c: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> main(argc,argv) /* Filestatus anzeigen */ int argc; char **argv; { struct stat buf; if(stat(argv[1],&buf) == -1) { perror("stat"); exit(1);} printf("Filename: %s \nUID: %ld\n",argv[1],buf.st_uid); printf("GID: %ld\n",buf.st_gid); if(buf.st_mode & S_IFDIR) printf("is dir\n"); /* klappt nur, wenn S_IFDIR genau 1 Bit belegt */ if((buf.st_mode & S_IWUSR)==S_IWUSR) printf("owner write\n"); /* besser */ if((buf.st_mode & S_IRGRP)==S_IRGRP) printf("group read\n"); if((buf.st_mode & S_IXOTH)==S_IXOTH) printf("other execute\n"); } |