ashwinbhy ashwinbhy - 3 years ago 46
C Question

Trying to simulate grep command

I am getting segmentation fault when i compile my code.

I am not getting what is wrong with my code will be happy if someone can help me.

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

int main(int argc,char *argv[])
{
FILE *fp;
char fline[100];
char *newline;
int i,count=0,occ=0;

fp=fopen(argv[1],"r");

while(fgets(fline,100,fp)!=NULL)
{
count++;
if(newline=strchr(fline,'\n'))
*newline='\0';
if(strstr(fline,argv[2])!=NULL)
{
printf("%s %d %s",argv[1],count,fline);
occ++;
}


}

printf("\n Occurence= %d",occ);

return 1;
}

fvu fvu
Answer Source

See man open and man fopen:

FILE *fp;
...
fp=open(argv[1],"r");

open returns an integer, not a file pointer. Just change that line to

fp=fopen(argv[1],"r");

Note: OP edited this error out of the code in the question, for those who wonder what this is about

Which leads us to (some other minor issues addressed as well - see comments):

+EDIT: point to places where error checking should be done:

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

int main(int argc, char *argv[]) {
    FILE *fp;
    char fline[100];
    char *newline;
    int i, count = 0, occ = 0;

    // for starters, ensure that enough arguments were passed:
    if (argc < 3) {
      printf("Not enough command line parameters given!\n");
      return 3;
    } 

    fp = fopen(argv[1], "r");
    // fopen will return if something goes wrong.  In that case errno will
    // contain the error code describing the problem (could be used with
    // strerror to produce a user friendly error message
    if (fp == null) {
      printf("File could not be opened, found or whatever, errno is %d\n",errno);
      return 3;
    } 


    while (fgets(fline, 100, fp) != NULL) {
        count++;
        if (newline = strchr(fline, '\n'))
            *newline = '\0';
        if (strstr(fline, argv[2]) != NULL) {
            // you probably want each found line on a separate line,
            // so I added \n
            printf("%s %d %s\n", argv[1], count, fline);
            occ++;
        }
    }
    // it's good practice to end your last print in \n
    // that way at least your command prompt stars in the left column
    printf("\n Occurence= %d", occ);

    return 1;
}

ps: so the error occurs during runtime and not during compile time - this distinction is quite crucial, because hunting down a compiler failure and solving a library usage error require rather different techniques...

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download