TechTorch

Location:HOME > Technology > content

Technology

Reading Lines of Input in a While Loop Until EOF Using scanf in C

June 03, 2025Technology1470
When working with file input in C, its common to encounter scenarios w

When working with file input in C, it's common to encounter scenarios where you need to read lines of input until the end-of-file (EOF) is reached. This article explores how to use the scanf function within a while loop to achieve this without missing the first part of every line. We will also discuss an alternative method for reading a file with scanf instead of fscanf.

Reading Lines of Input Until EOF with scanf

To read lines of input using scanf in a loop until end-of-file (EOF) is reached, a combination of scanf and a loop structure can be effectively utilized. While scanf is designed to read formatted input, it doesn't directly read entire lines. Instead, you can read input until a newline character is encountered. Here's an example:

include stdio.hint main() {    char buffer[256];  // Buffer to hold the input line    // Loop until EOF is reached    while (scanf("%5[^n]", buffer)) {        printf("%s", buffer);  // Process and print input        getchar();  // Consume the newline character left in the input buffer    }    return 0;}

Explanation:

Buffer Declaration: A character array buffer is declared to store the input line. While Loop: The loop continues as long as scanf successfully reads a line. The format specifier %5[^n] tells scanf to read up to 255 characters or until a newline is encountered, whichever comes first. Processing Input: Inside the loop, the input can be processed as needed. In this case, it is simply printed. Consuming the Newline: After reading the line, getchar is called to consume the newline character that remains in the input buffer. This ensures that scanf can start fresh on the next iteration. Handling EOF: When EOF is reached (e.g., by pressing Ctrl D in Unix/Linux or Ctrl Z in Windows), scanf will return EOF, and the loop will terminate.

This method ensures that you read each line completely without missing any part of it while still using scanf, as per your requirement.

Using scanf Instead of fscanf to Read a File

Are you wanting to use scanf instead of fscanf to read a file? If so, the method involves the following steps:

Make a copy of stdin using dup. Use freopen with scanf instead of the usual fscanf. Reassign stdin back to its original file handle using dup2. Close the file handle that was used for stdin using fclose.

Here is an example C code that reads the file nums.txt, which contains a few positive integers each on a separate line, using scanf and prints the contents:

include io.hinclude stdio.hint main(void) {    signed int stdin_copy  0;    unsigned int num  0U;    FILE *infile  NULL;    stdin_copy  dup(fileno(stdin));  // Make a copy of stdin    infile  freopen("nums.txt", "r", stdin);  // Redirect stdin to the file    if (infile  NULL) {        printf("Unable to redirect stdin to the user file.");    } else {        while (scanf("%u", num) ! EOF) {            printf("%u", num);        }    }    fflush(infile);    fflush(stdout);    dup2(stdin_copy, fileno(stdin));  // Reassign stdin back to original file handle    fclose(infile);  // Close the file handle    infile  NULL;    num  0U;    stdin_copy  0;    return 0;}

Output:

5101520253035

This example demonstrates how to redirect stdin to a file using freopen, safely read the file line by line with scanf, and then restore the original stdin using dup2. This approach ensures that the file is read correctly and the program can return to its usual state after processing the file.