typestar

wc_clone.c en C

Un clon de wc: leer archivos nombrados o stdin y contar líneas, palabras y bytes.

#include <ctype.h>
#include <stdio.h>

typedef struct {
    long lines;
    long words;
    long bytes;
} Counts;

static Counts count_stream(FILE *f) {
    Counts c = {0, 0, 0};
    int in_word = 0;
    int ch;

    while ((ch = fgetc(f)) != EOF) {
        c.bytes++;
        if (ch == '\n') {
            c.lines++;
        }
        if (isspace(ch)) {
            in_word = 0;
        } else if (!in_word) {
            in_word = 1;
            c.words++;
        }
    }
    return c;
}

static void print_counts(Counts c, const char *label) {
    printf("%8ld %8ld %8ld  %s\n", c.lines, c.words, c.bytes, label);
}

int main(int argc, char **argv) {
    if (argc < 2) {
        print_counts(count_stream(stdin), "-");
        return 0;
    }

    Counts total = {0, 0, 0};
    int failures = 0;

    for (int i = 1; i < argc; i++) {
        FILE *f = fopen(argv[i], "rb");
        if (f == NULL) {
            fprintf(stderr, "cannot open %s\n", argv[i]);
            failures++;
            continue;
        }
        Counts c = count_stream(f);
        if (ferror(f)) {
            fprintf(stderr, "error reading %s\n", argv[i]);
            failures++;
        }
        fclose(f);

        print_counts(c, argv[i]);
        total.lines += c.lines;
        total.words += c.words;
        total.bytes += c.bytes;
    }

    if (argc > 2) {
        print_counts(total, "total");
    }
    return failures > 0;
}

Cómo funciona

  1. Cada archivo se cuenta con una pasada sobre sus caracteres.
  2. Sin argumentos, recurre a leer stdin.
  3. Una línea de totales se imprime cuando se dio más de un archivo.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
67
Caracteres a escribir
1075
Tokens
374
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 214 segundos.

Escribe este fragmento

Paso 1 de 1 en Bis; paso 12 de 12 en Archivos y E/S.

← Anterior