I117 8 1 School of Information Science, Japan Advanced Institute of Science and Technology
: CR (0x0d) LF (0x0a) line separator CR Mac LF UNIX CR+LF MS-DOS WINDOWS Japan Advanced Institute of Science and Technology 2008 1-2 1
od % ls -1 head -2 I117-0.aux I117-0.dvi % ls head -2 od -c 0000000 I 1 1 7-0. a u x \n I 1 1 0000020 0. d v i \n 0000026 % ls head -2 od -t x1 0000000 49 31 31 37 2d 30 2e 61 75 78 0a 49 31 31 37 2d 0000020 30 2e 64 76 69 0a 0000026 LF (\n 0x0a) Japan Advanced Institute of Science and Technology 2008 1-2 2
C OS fopen fgets fputs, fprintf fclose Japan Advanced Institute of Science and Technology 2008 1-2 3
FILE *fp; char line[bufsiz]; fp = fopen("foo", "r"); if(!fp) { } while(fgets(line, BUFSIZ, fp)) { } fclose(fp); Japan Advanced Institute of Science and Technology 2008 1-2 4
fp = fopen("foo", "w"); if(!fp) { } while() { fprintf(fp, "%s\n", line); fputs(line, fp); } fclose(fp); Japan Advanced Institute of Science and Technology 2008 1-2 5
stdin stdout stderr stdin program stdout stderr Japan Advanced Institute of Science and Technology 2008 1-2 6
(cont.) a.out lc.c %./a.out < lc.c 12 lines Japan Advanced Institute of Science and Technology 2008 1-2 7
(cont.) ls a.out % ls./a.out a.out wc %./a.out wc 1 2 9 3 Japan Advanced Institute of Science and Technology 2008 1-2 8
: BUFSIZ... 512, 1024, 4096, 8192 setvbuf Japan Advanced Institute of Science and Technology 2008 1-2 9
: BUFSIZ (cont.) BUFSIZ #include <stdio.h> int main() { printf("bufsiz %d\n", BUFSIZ); } SunOS 5.9 1024 %./a.out BUFSIZ 1024 Japan Advanced Institute of Science and Technology 2008 1-2 10
#include <stdio.h> #include <stdlib.h> int main() { int lno; char line[bufsiz]; lno = 0; while(fgets(line, BUFSIZ, stdin)) lno++; printf("%d lines\n", lno); } Japan Advanced Institute of Science and Technology 2008 1-2 11
(cont.) : 5 % ls / head -5./a.out 5 lines fgets BUFSIZ wc Japan Advanced Institute of Science and Technology 2008 1-2 12
(cont.) /tmp/z wc % echo man man > /tmp/z % echo man man >> /tmp/z % echo man man >> /tmp/z % cat /tmp/z wc 3 5724 38100 % cat /tmp/z./a.out 39 lines Japan Advanced Institute of Science and Technology 2008 1-2 13
n<bufsiz LF LF BUFSIZ n>=bufsiz LF LF n>>bufsiz LF
(cont.) line wc while(fgets(line, BUFSIZ, stdin)) { lw = strlen(line); if(lw>=1 && line[lw-1]== \n ) { lno++; } } % cat /tmp/z./a.out 3 lines Japan Advanced Institute of Science and Technology 2008 1-2 15
#include <stdio.h> #include <stdlib.h> #include <string.h> int Xstrcmp(const void *x, const void *y) { char *xp=*(char**)x, *yp=*(char**)y; return strcmp(xp, yp); } Japan Advanced Institute of Science and Technology 2008 1-2 16
#define NLINES (100) char tmp[bufsiz]; char **lines; int n, i; n = 0; lines = (char**)malloc(sizeof(char*)*nlines); while(fgets(tmp, BUFSIZ, stdin)) { if(n>nlines-1) { break; } lines[n] = strdup(tmp); n++; } qsort(lines, n, sizeof(char*), Xstrcmp);
(cont.) input % cat in.lsort jaist asahida tatukuchi ishikawa japan output %./a.out < in.lsort 0: asahida 1: ishikawa 2: jaist 3: japan 4: tatukuchi Japan Advanced Institute of Science and Technology 2008 1-2 18
331.0 43.10 332.5 39.41 380.6 48.18 0-9 (0x2e)> (0x20) (\t, 0x09) Japan Advanced Institute of Science and Technology 2008 1-2 19
(cont.) white(s) real number real number 3 3 1. 0 \t 4 3. 1 0 \n while (< >) { ( ) } Japan Advanced Institute of Science and Technology 2008 1-2 20
(char*p) #define takereal(r) { \ char tmp[bufsiz]; char *q = tmp;\ r = -1.0; \ while((*p>= 0 &&*p<= 9 ) *p==. ){\ *q++ = *p++; } \ *q = \0 ; \ if(*tmp) r = atof(tmp); \ while(*p&&(*p== *p== \t )) p++; } -1 Japan Advanced Institute of Science and Technology 2008 1-2 21
Japan Advanced Institute of Science and Technology 2008 1-2 22
; char line[bufsiz]; char *p; double a1, a2; while(fgets(line, BUFSIZ, stdin)) { p = line; takereal(a1); takereal(a2); printf("%.2f\n", a1/a2); } Japan Advanced Institute of Science and Technology 2008 1-2 23
; (cont.) %./a.out < G1 7.68 8.44 7.90 7.90 [km/l] Japan Advanced Institute of Science and Technology 2008 1-2 24
; double a1, sum; sum = 0.0; while(fgets(line, BUFSIZ, stdin)) { p = line; takereal(a1); sum += a1; } printf("%.2f\n", sum); Japan Advanced Institute of Science and Technology 2008 1-2 25
; double sum = 0.0; int num=0; while(fgets(line, BUFSIZ, stdin)) { p = line; takereal(a1); sum += a1; num++; } printf("%.2f %d ave %.2f\n", sum, num, sum/num); Japan Advanced Institute of Science and Technology 2008 1-2 26
; %./a.out < G1 1044.10 %./a.out < G1 1044.10 3 ave 348.03 Japan Advanced Institute of Science and Technology 2008 1-2 27
# (0x23) p = line; if(*p== # ) { continue; } if(*p== \n ) { continue; } Japan Advanced Institute of Science and Technology 2008 1-2 28
#define takereal(r) { \ char tmp[bufsiz]; char *q = tmp;\ r = -1.0; \ while(*p&&(*p== *p== \t )) p++; \ while((*p>= 0 &&*p<= 9 ) *p==. ) {\ *q++ = *p++; } \ *q = \0 ; \ if(*tmp) r = atof(tmp); } Japan Advanced Institute of Science and Technology 2008 1-2 29
1) (BUFSIZE ) 2) 3) Japan Advanced Institute of Science and Technology 2008 1-2 30
(cont.) 4) 35.59 9.09 0.29 105.78 55.86 76.18 9.62 112.53 5.35 43.43 5) 4) Japan Advanced Institute of Science and Technology 2008 1-2 31
(cont.) 6) int nthreal(double *dst, char *src, int n); Japan Advanced Institute of Science and Technology 2008 1-2 32
(cont.) 7) a) x i b) f i f k n c) k i=1 f i d) k i=1 f i n e) 5 x k, f k, f k n, k i=1 f i, k i=1 f i n Japan Advanced Institute of Science and Technology 2008 1-2 33
w/o dup 11 12 13 14 15 16 17 100 11 1 14.29 1 14.29 12 1 14.29 2 28.57 80 13 1 14.29 3 42.86 60 14 1 14.29 4 57.14 40 15 1 14.29 5 71.43 20 16 1 14.29 6 85.71 0 17 1 14.29 7 100.00 CDF [%] 11 12 13 14 15 16 17 w/ dup 11 14 13 11 14 16 14 11 2 28.57 2 28.57 40 13 1 14.29 3 42.86 20 14 3 42.86 6 85.71 0 16 1 14.29 7 100.00 CDF [%] 100 80 60 x i 11 12 13 14 15 16 x i