Reading a File Line By Line

Dave Sinkula 2 Tallied Votes 61K Views Share

While not terribly difficult, first timers may not know the functions to look up and use. Here is some basic code for reading a file one line at a time. The contents of the file are printed to the stdout.

#include <stdio.h>

int main ( void )
{
   static const char filename[] = "file.txt";
   FILE *file = fopen ( filename, "r" );
   if ( file != NULL )
   {
      char line [ 128 ]; /* or other suitable maximum line size */

      while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
      {
         fputs ( line, stdout ); /* write the line */
      }
      fclose ( file );
   }
   else
   {
      perror ( filename ); /* why didn't the file open? */
   }
   return 0;
}

/* file.txt
This text is the contents of the file named, "file.txt".

It is being used with some example code to demonstrate reading a file line by
line. More interesting things could be done with the output, but I'm trying to
keep this example very simple.
*/

/* my output
This text is the contents of the file named, "file.txt".

It is being used with some example code to demonstrate reading a file line by
line. More interesting things could be done with the output, but I'm trying to
keep this example very simple.
*/

Dani AI

Generated

If you need robust, line-by-line reading without fixed-size limits, prefer dynamically sized reads and validate each line before using it. Fixed 2D arrays can overflow, cause unterminated strings, or segfault when you accidentally print a pointer or write past bounds. Also do not assume a trailing newline on the last line; always check the function’s return value and handle CRLF by trimming any trailing '\r' and '\n'.

Example: read each line, parse records like "id x y z", and use the coordinates for a requested id. This approach scales to arbitrarily long lines and large files.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void rstrip(char *s) { s[strcspn(s, "\r\n")] = '\0'; }

int find_point(const char *path, long target, double *x, double *y, double *z) {
    FILE *f = fopen(path, "r");
    if (!f) return -1;
    char *line = NULL; size_t cap = 0;
    while (getline(&line, &cap, f) != -1) {
        rstrip(line);
        long id; double a, b, c;
        if (sscanf(line, "%ld %lf %lf %lf", &id, &a, &b, &c) == 4 && id == target) {
            *x = a; *y = b; *z = c;
            free(line); fclose(f); return 1;
        }
    }
    free(line); fclose(f); return 0; /* not found */
}

For GPS/NMEA validation, compare the sentence prefix and verify the checksum: XOR all bytes between '$' and '' and match the two hex digits after ''. See getline(3), fgets, and gpsd’s NMEA notes at https://gpsd.gitlab.io/gpsd/NMEA.html.

khuman_nb 0 Newbie Poster

I thinks instead of depending on the length of the line (which can be variable depeding on the type of editor and its settings).I think it'll be better to look for '\n' which is line separator.

Dave Sinkula 2,398 long time no c Team Colleague

I thinks instead of depending on the length of the line (which can be variable depeding on the type of editor and its settings).I think it'll be better to look for '\n' which is line separator.

Then you would be describing doing this "by character" rather than by line. Otherwise you are wonderfully overcomplicating this with dynamic memory allocation a la C++'s std::string.

darylcharm 0 Newbie Poster

hi this is great!

can you tell me how do i put each line to an array?

Tmo 0 Newbie Poster

hi guys
i just modified the one i got here: this will read line by line from a text file then stored every line to an array;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <ctype.h>
#include <time.h>
#include <sys/types.h>


int main ( void )
{
static const char filename[] = "data.txt";
FILE *file = fopen ( filename, "r" );
int i, j;
char arra[128][128];
char line[128]; /* or other suitable maximum line size */



for(i=0; i<128; i++)
for(j=0; j<128; j++)
arra[j] = '\0';


for(i=0; i<128; i++)
line = '\0';


if ( file != NULL )
{


i=0;


while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{


strcpy(arra, line);
printf("array ----> %s ", &arra);
i++;


}
fclose ( file );
}
else
{
perror ( filename ); /* why didn't the file open? */
}



return 0;
}
tirmizi 0 Newbie Poster

i want to Read a line from file then compare it to a sentense(GPS Sentence) and if its match(valid) then display this line else display Error

plz advice
Regards

Dionysus 0 Newbie Poster

thanks for this code this is just what im looking for..:D

swaythi 0 Newbie Poster

Im very much thankful to you for providing the coding for me

swaythi 0 Newbie Poster

thank you for the code..!!![/COLOR]

bojomojo 0 Newbie Poster

I tried using this code, but it gives a segmentation error when trying to read the last line of the file

kanishka.keshav 0 Newbie Poster

may be you should avoid placing a newline character twice at the end of the file.
coz after the new line character it will try to read the next line but the fileEnd comes up

zoidac 0 Newbie Poster

Good Afternoon, i would like to ask you a question.

I have got file which structured as
"point id" "x coordinates" "y coordinates" "z coordinates"

I would like to open file and search for point id then if point exist in the file
I would like to use x,y and z coordinates of the point.

I will call 4 point like that and calculate the cross-section point coordinates
then write it on file by giving point id by user.

and I also would like to chech if the point id giving by user is exist in the file too.

I dont need the calculation part, i will match variables to x1,y1,z1, ..... x4,y4,z4,
and calculate x5,y5,z5 but i couldnt manage other things.

I will be glad to have any help.

'CoffeeLike 0 Newbie Poster

thank

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.