fgets reads one line at a time into a character buffer.

line buffer The buffer limits how many characters one `fgets` call can store.
count lines The loop increments a counter for each successfully read line.

Read Lines

extraLine
read_lines.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int main(void) {
    int extraLine = 0;
    FILE *file = fopen("read_lines_demo.txt", "w+");

    if (file == 0) {
        return 1;
    }

    fputs("alpha\n", file);
    fputs("beta\n", file);
    if (extraLine) {
        fputs("gamma\n", file);
    }

    rewind(file);

    char line[16];
    int lines = 0;
    while (fgets(line, sizeof line, file) != 0) {
        lines++;
    }

    fclose(file);
    remove("read_lines_demo.txt");

    printf("lines=%d\n", lines);
    return 0;
}
#include <stdio.h>

int main(void) {
    int extraLine = 1;
    FILE *file = fopen("read_lines_demo.txt", "w+");

    if (file == 0) {
        return 1;
    }

    fputs("alpha\n", file);
    fputs("beta\n", file);
    if (extraLine) {
        fputs("gamma\n", file);
    }

    rewind(file);

    char line[16];
    int lines = 0;
    while (fgets(line, sizeof line, file) != 0) {
        lines++;
    }

    fclose(file);
    remove("read_lines_demo.txt");

    printf("lines=%d\n", lines);
    return 0;
}
  1. extraLine ← 0, file ← ⟨addr A⟩, line ← (empty), lines ← 0

    3int main(void) {4    int extraLine→ 0 = 0; //@extraLine=15    FILE *file→ ⟨addr A⟩ = fopen("read_lines_demo.txt", "w+");67    if (file == 0) {8        return 1;9    }1011    fputs("alpha\n", file⟨addr A⟩);12    fputs("beta\n", file⟨addr A⟩);13    if (extraLine) {14        fputs("gamma\n", file);15    }1617    rewind(file⟨addr A⟩);1819    char line→ (empty)[16];20    int lines→ 0 = 0;21    while (fgets(line, sizeof line, file) != 0) {
  2. lines ← 1

    pass 1 of 2
    20int lines = 0;21while (fgets(linealpha
    , sizeof line, file⟨addr A⟩) != 0) {22    lines→ 1++;23}
  3. lines ← 2

    pass 2 of 2
    20int lines = 0;21while (fgets(linebeta
    , sizeof line, file⟨addr A⟩) != 0) {22    lines→ 2++;23}
  4. fclose(file);

    25    fclose(file⟨addr A⟩);26    remove("read_lines_demo.txt");2728    printf("lines=%d\n", lines2);29    return 0;30}
    outputlines=2
  1. extraLine ← 1, file ← ⟨addr A⟩

    3int main(void) {4    int extraLine→ 1 = 1;5    FILE *file→ ⟨addr A⟩ = fopen("read_lines_demo.txt", "w+");67    if (file == 0) {8        return 1;9    }1011    fputs("alpha\n", file⟨addr A⟩);12    fputs("beta\n", file⟨addr A⟩);13    if (extraLine) {
  2. if (extraLine)

    12fputs("beta\n", file);13if (extraLine1) {14    fputs("gamma\n", file⟨addr A⟩);15}
  3. line ← (empty), lines ← 0

    17rewind(file⟨addr A⟩);1819char line→ (empty)[16];20int lines→ 0 = 0;21while (fgets(line, sizeof line, file) != 0) {
  4. lines ← 1

    pass 1 of 3
    20int lines = 0;21while (fgets(linealpha
    , sizeof line, file⟨addr A⟩) != 0) {22    lines→ 1++;23}
    All 3 passes — pass 1 is the card above
    passlinelines
    1alpha 0 1
    2beta 1 2
    3gamma 2 3
  5. fclose(file);

    25    fclose(file⟨addr A⟩);26    remove("read_lines_demo.txt");2728    printf("lines=%d\n", lines3);29    return 0;30}
    outputlines=3