Navigationskarta Insitutitionen för Datavetenskap Umeå Universitet

Kodexempel F5

/* This code skips an empty line, if and only  */
/* if it's there. ifp's current location will  */
/* be at the beginning of the data block when  */
/* this routine ends.                          */

/* Of course, we must check return values from */
/* ftell/fgets/fseek, but this is not shown    */
/* here for the sake of brevity.               */
...
	pos = ftell(ifp);
	fgets(buf, BUFSZ, ifp);

	/* Check if we have "eaten" a data line */
	if (buf[0]!='\n') 
       fseek(ifp, pos, SEEK_SET);
...


#include <sys/types.h> #include <dirent.h> #include <stdio.h> int main(void) { DIR *dp; struct dirent *dep; dp = opendir("."); while ((dep = readdir(dp)) != NULL) printf("%s\n", dep->d_name); closedir(dp); return 0; }
#include <sys/types.h> #include <dirent.h> #include <stdio.h> int main(void) { DIR *dp; struct dirent *dep; if ((dp = opendir(".")) == NULL) { perror("opendir() failed"); return(1); } else { while ((dep = readdir(dp)) != NULL) printf("%s\n", dep->d_name); closedir(dp); } return 0; }
#include <errno.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main(void) { int ifh; extern int errno; ifh = open("finns_inte.txt", O_RDONLY); if (ifh == -1) { perror("open()"); printf("Fel %d uppstod. Förklaring: %s\n", errno, strerror(errno)); } else close(ifh); return 0; }
Utdata:
open(): No such file or directory
Fel 2 uppstod. Förklaring: No such file or directory


#include <stdio.h> #include <stdlib.h> /* Läs n från en fil. Läs sedan n heltal. */ /* Returvärdeskontroller utelämnade i exemplet. */ int *read_ints(int *n) { FILE *ifp; int i; int *buf; ... /* Öppna filen */ fscanf(ifp, "%d", n); buf=malloc(*n*sizeof(int)); for (i=0; i<*n; i++) fscanf(ifp, "%d", &buf[i]); fclose(ifp); return buf; }
Programmet startar: USER RSS VSZ COMMAND gunnar 392 800 a.out Programmet allokerar 10 MB (malloc): USER RSS VSZ COMMAND gunnar 408 11048 a.out Programmet frigör 10 MB (free): USER RSS VSZ COMMAND gunnar 408 11048 a.out
Denna OH hann jag tyvärr inte visa på föreläsningen. Den beskriver det intressanta fenomenet att free() inte lämnar tillbaka minnet till operativsystemet. Detta är överkurs.
Kommando för ovanstående mätningar:
ps -u gunnar -o user,rss,vsz,comm | egrep 'a.out|RSS'

Nedanstående OH hade jag inte heller tid med på föreläsningen. Den illustrerar användning av funktionspekare och quicksort. Notera att sizeof(pl) inte är vad du tror att det är. Jag har sagt att namnet på en array är en pekare till arrayens första element, och har samma typ som arrayens första element, dvs sizeof(pl) borde vara detsamma som sizeof(pl[0]). Det finns dock några undantag från regeln, och ett av undantagen råkar vara när arrayens namn är operand till sizeof. I detta fall får vi alltså hela arrayens storlek från sizeof.

#include <stdlib.h>
#include <stdio.h>

struct Person { char *name; int age; };

int cmp_pers(const void *e1, const void *e2)
{
	struct Person const *p1 = e1, *p2 = e2;
	return strcmp(p1->name, p2->name);
}

int main()
{
  int i;
  struct Person pl[]={{"Carl", 21}, {"Bo", 24}, {"Arne", 32}};

  qsort(pl, sizeof(pl)/sizeof(pl[0]), sizeof(pl[0]), cmp_pers);

  for(i=0; i<sizeof(pl)/sizeof(pl[0]); i++)
    printf("%-5s  %d\n", pl[i].name, pl[i].age);

  return 0;
}

[an error occurred while processing this directive]