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
- Cada archivo se cuenta con una pasada sobre sus caracteres.
- Sin argumentos, recurre a leer stdin.
- Una línea de totales se imprime cuando se dio más de un archivo.
Palabras clave y builtins usados aquí
FILENULLcharconstcontinueelseforifintlongreturnstaticstructtypedefvoidwhile
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.
Paso 1 de 1 en Bis; paso 12 de 12 en Archivos y E/S.