Going through a text file line by line in C
Solution 1:
So many problems in so few lines. I probably forget some:
- argv[0] is the program name, not the first argument;
- if you want to read in a variable, you have to allocate its memory
- one never loops on feof, one loops on an IO function until it fails, feof then serves to determinate the reason of failure,
- sscanf is there to parse a line, if you want to parse a file, use fscanf,
- "%s" will stop at the first space as a format for the ?scanf family
- to read a line, the standard function is fgets,
- returning 1 from main means failure
So
#include <stdio.h>
int main(int argc, char* argv[])
{
char const* const fileName = argv[1]; /* should check that argc > 1 */
FILE* file = fopen(fileName, "r"); /* should check the result */
char line[256];
while (fgets(line, sizeof(line), file)) {
/* note that fgets don't strip the terminating \n, checking its
presence would allow to handle lines longer that sizeof(line) */
printf("%s", line);
}
/* may check feof here to make a difference between eof and io failure -- network
timeout for instance */
fclose(file);
return 0;
}
Solution 2:
To read a line from a file, you should use the fgets
function: It reads a string from the specified file up to either a newline character or EOF
.
The use of sscanf
in your code would not work at all, as you use filename
as your format string for reading from line
into a constant string literal %s
.
The reason for SEGV is that you write into the non-allocated memory pointed to by line
.
Solution 3:
In addition to the other answers, on a recent C library (Posix 2008 compliant), you could use getline. See this answer (to a related question).