Reading from files in C - Time & Space Complexity
When reading from files, we want to know how the time needed grows as the file size grows.
We ask: How does reading more data affect how long the program runs?
Analyze the time complexity of the following code snippet.
FILE *file = fopen("data.txt", "r");
char buffer[256];
while (fgets(buffer, sizeof(buffer), file)) {
// process the line
}
fclose(file);
This code reads a file line by line until the end, processing each line.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Reading each line from the file using fgets inside a while loop.
- How many times: Once for every line in the file, repeating until the file ends.
As the file gets bigger, the number of lines grows, so the loop runs more times.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 lines | About 10 reads |
| 100 lines | About 100 reads |
| 1000 lines | About 1000 reads |
Pattern observation: The time grows directly with the number of lines; double the lines, double the reads.
Time Complexity: O(n)
This means the time to read the file grows in a straight line with the number of lines in the file.
[X] Wrong: "Reading a file always takes the same time no matter the size."
[OK] Correct: The program reads each line one by one, so more lines mean more work and more time.
Understanding how file reading time grows helps you write efficient programs and explain your code clearly in interviews.
"What if we read the file character by character instead of line by line? How would the time complexity change?"
Practice
fopen() function with mode "r" do in C?Solution
Step 1: Understand fopen modes
The mode "r" in fopen means open the file for reading only.Step 2: Check other modes
Modes like "w" are for writing, "a" for appending, and none delete files.Final Answer:
It opens a file for reading only. -> Option BQuick Check:
fopen with "r" = open for reading [OK]
- Confusing "r" with write mode "w"
- Thinking fopen deletes or creates files with "r"
- Not checking if file exists before reading
data.txt for reading in C?Solution
Step 1: Check fopen syntax
fopen requires two arguments: filename and mode as strings.Step 2: Identify correct mode for reading
"r" is the mode to open a file for reading.Final Answer:
FILE *fp = fopen("data.txt", "r"); -> Option AQuick Check:
Correct fopen syntax with "r" mode = FILE *fp = fopen("data.txt", "r"); [OK]
- Using "w" mode which opens for writing, not reading
- Omitting the mode argument in fopen
- Using "a" mode which opens for appending
input.txt contains the line "Hello"?
FILE *fp = fopen("input.txt", "r");
char buffer[10];
fgets(buffer, 10, fp);
printf("%s", buffer);
fclose(fp);Solution
Step 1: Understand fgets behavior
fgets reads a line including the newline character if it fits in the buffer.Step 2: Check file content and output
The file has "Hello" followed by a newline, so fgets reads "Hello\n" and prints it.Final Answer:
Hello\n -> Option AQuick Check:
fgets includes newline if present = Hello\n [OK]
- Assuming fgets removes newline automatically
- Confusing null terminator with newline
- Not checking if file opened successfully
FILE *fp = fopen("file.txt", "r");
char c;
c = fgetc(fp);
printf("%c", c);
fclose(fp);Solution
Step 1: Check file open validation
Always check if fopen returns NULL before reading to avoid errors.Step 2: Review other parts
fgetc is correct for reading one char; c as char is acceptable; fclose after reading is correct.Final Answer:
Missing check if fopen returned NULL before reading. -> Option DQuick Check:
Always check fopen result before file operations [OK]
- Skipping NULL check after fopen
- Confusing fgetc and fgets usage
- Closing file too early
log.txt and print them. Which code snippet correctly does this in C?Solution
Step 1: Check file open mode
Opening with "r" is correct for reading; "w" would overwrite the file.Step 2: Validate reading loop and printing
Using fgets with NULL check is correct; printf with "%s" is safe and prints lines properly.Step 3: Review other options
FILE *fp = fopen("log.txt", "w"); char line[100]; while(fgets(line, 100, fp) != NULL) { printf("%s", line); } fclose(fp); uses wrong mode "w"; FILE *fp = fopen("log.txt", "r"); char c; while((c = fgetc(fp)) != EOF) { printf("%c", c); } fclose(fp); reads char by char, not lines; FILE *fp = fopen("log.txt", "r"); char line[100]; while(fgets(line, 100, fp)) { printf(line); } fclose(fp); uses printf(line) without format string, unsafe.Final Answer:
Correct reading lines with fgets and printing with printf("%s", line). -> Option CQuick Check:
Use fgets + printf("%s") + fopen with "r" [OK]
- Opening file with wrong mode "w" for reading
- Using printf without format string
- Reading char by char when lines needed
Ready to prove it?
Pass the test and this pattern moves unknown
