COMP1721 - Higher Computing 1B

Computing 1B - Week 07 Tutorial Solutions

  1. #include <stdio.h>
    
    int
    main(int argc, char *argv[]) {
        FILE *f;
        int i;
        
        f = fopen("numbers", "w");
        if (f == NULL) {
            fprintf(stderr, "Can not openm file numbers for writing\n");
            return 1;
        }
        for (i = 1; i <= 1000; i++)
            fprintf(f, "%d\n", i);
        fclose(f);
        return 0;
    }
    

  2. #include <stdio.h>
    
    void
    count(char *filename) {
        int characters = 0;
        int lines = 0;
        int ch;
        FILE *f;
        
        f = fopen(filename, "r");
        if (f == NULL) {
            fprintf(stderr, "count: %s: ", filename);
            perror("");
            return;
        }
        while ((ch = fgetc(f)) != EOF) {
            characters++;
            if (ch == '\n')
                lines++;
        }
        fclose(f);
        printf("%s: %d characters %d lines\n", filename, characters, lines);
    }
    
    int
    main(int argc, char *argv[]) {
        int i;
        
        for (i = 1; i < argc; i++)
            count(argv[i]);
        return 0;
    }
    

  3. #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    enum {
        DEFAULT_NLINES = 10,
        MAX_LINE_LENGTH = 256
    };
    
     
    void
    head(char *filename, int n_lines) {
        FILE *f;
        int  ch, lines;
        
        f = fopen(filename, "r");
        if (f == NULL) {
            fprintf(stderr, "grep: %s: ", filename);
            perror("");
            return;
        }
        lines = 0;
        while ((ch = fgetc(f)) != EOF) {
            putchar(ch);
            if (ch == '\n')
                lines++;
            if (lines >= n_lines)
                break;
        }
        fclose(f);
    }
    
    /*
     * Or using fgets which has the disadvantage 
     * of a maximum line length.
     */
    void
    head1(char *filename, int n_lines) {
        FILE *f;
        int  line_number;
        char line[MAX_LINE_LENGTH+2];
        
        f = fopen(filename, "r");
        if (f == NULL) {
            fprintf(stderr, "grep: %s: ", filename);
            perror("");
            return;
        }
        for (line_number = 0; line_number < n_lines; line_number++) {
            if (fgets(line, MAX_LINE_LENGTH, f) == NULL)
                break;
            fputs(line, stdout);
        }
        fclose(f);
    }
    
    void
    usage() {
        fprintf(stderr, "Usage: head [-n lines] ");
        exit(1);
    }
    
    int
    main(int argc, char *argv[]) {
        int n_lines = DEFAULT_NLINES;
        char *filename;
        
        if (argc != 2 && argc != 4)
            usage();
            
        if (argc == 2)
            filename = argv[1];
        else {
            if (strcmp(argv[1], "-n") != 0)
                usage();
            n_lines = atoi(argv[2]);
            filename = argv[3];
        } 
        head(filename, n_lines);
        return 0;
    }
    


Andrew Taylor (andrewt@cse.unsw.edu.au)
Higher Computing 1B, Computer Science & Engineering, UNSW