Search code examples
cfilelineskipfault

Skip lines while file scanning multiple lines


This code will read a file and print it as long as the file is in this format

word,12,34
words,40,20
another,20,11

How do I get it to do the same if its got an empty line in between like this because right now it just gives me a segmentation fault

word,12,34

words,40,20

another,20,11



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
    FILE *pdata;
    char buffer[1000];
    char *token, *del=",";
    int value1;
    double value2;


    pdata = fopen ("file.data", "r");

    if(pdata == NULL)
    {
        printf("unable to open file \n");
        exit(1);
    }

    while( fgets(buffer, sizeof(buffer), pdata) != NULL )
    {
        token = strtok(buffer, del);
        value1 = atoi( strtok(NULL, del) );
        value2 = atof( strtok(NULL, del) );

        printf("%s is %.3lf\n", token, value1 + value2);

    }

    fclose( pdata );


return 0;
}   

Please Help


Solution

  • Two changes I would make:

    char *del = ", "; // test for either space or comma
    

    And (per my comment to the question earlier):

    while( fgets(buffer, sizeof(buffer), pdata) != NULL )
    {
        char *temp;
        token = strtok(buffer, del);
        if (token != NULL) {
          temp = strtok(NULL, del);
          if (temp) value1 = atoi( temp );
          temp = strtok(NULL, del);
          if (temp) {
            value2 = atof( temp );
            printf("%s is %.3lf\n", token, value1 + value2);
          }
    }
    

    The strtok will return NULL if no token is found. Passing a NULL string to atoi is what's giving you the seg fault, I'm guessing. Like this, we make absolutely sure that doesn't happen. I tested this and it works.