РЕДАКТИРОВАТЬ: Я решил проблему с выходным файлом (всегда с учетом регистра).Но первая проблема с ошибкой сегментации все еще существует.
* РЕДАКТИРОВАТЬ 2: Итак, я запустил GDB, и это пришло *
Program received signal SIGSEGV, Segmentation fault.
_IO_new_fclose (fp=0x0) at iofclose.c:54
54 if (fp->_IO_file_flags & _IO_IS_FILEBUF)
РЕДАКТИРОВАТЬ 3: Это показывает, что ошибка находится в fclose (файл) на lineCounter mygrep.c: 42
У меня проблема с моей C-программой.Чтобы дать ему немного информации, для нашего первого назначения нас попросили реализовать команду grep в системах на основе UNIX в C. У нас есть аргументы, такие как grep [-i] [-o outfile] ключевое слово filename (для чтения).
, если присутствует [- i] , искомое ключевое слово будет нечувствительным к регистру.
, если указано [- o outfile] ,результат будет записан в этом файле.В противном случае оно будет передано на экран.
ключевое слово - шаблон, который мы должны искать, а filename - имя файла, который будет прочитан.
Все шло нормально, пока я не попытался реализовать раздел [- o outfile] , где он проверяет, имеет ли он значение NULL или нет.
Без присутствия [-o outfile] программа успешно выводит результат на экран (без учета регистра и с учетом регистра), но в конце выдает Ошибка сегментации (ядро сброшено) несмотря на то, что работает.
Итак, для визуализации проблемы это выглядит так:
EXAMPLE.IN имеет =
ARduino
ретард
ARD
mygrep -i ard example.in
Эта команда печатает
ARduino
retard
ARD
Segmentation Fault(core dumped)
То же самое относится и к регистру, но оно работает
mygrep -i ard example.in
ard
Segmentation Fault(core dumped)
Я действительно не мог понять, почему это происходит, я новичок в CЯ обычно пишу на Java.
Вот метод main.c:
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include "mygrep.h"
int main(int argc, char **argv)
{
bool caseSensitive = true;
char *outfile = NULL;
int c;
while((c= getopt(argc,argv,"io:"))!= -1)
{
switch(c)
{
case 'i' : caseSensitive = false;
break;
case 'o' : outfile = optarg;
break;
default:
break;
}
}
char *keyword = argv[optind];
char *inputfile = argv[optind+1];
mygrep(inputfile,caseSensitive,keyword,outfile);
}
Метод mygrep.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mygrep.h"
static int lineCounter(char filename[])
{
FILE *file = fopen(filename,"r");
int lines,c;
lines = 0;
if(file)
{
while((c = getc(file)) !=EOF)
{
if(c == '\n')
{
++lines;
}
}
}
fclose(file); //** THIS IS THE LINE WHERE DEBUGGER GETS ERROR**
return lines;
}
int mygrep(char filename[],bool caseSensitive,char pattern[],char outfile[])
{
char str[100];
int lines = lineCounter(filename);
FILE *file = fopen(filename,"r");
FILE *out;
int i = 0;
if (outfile != NULL)
{
out = fopen(outfile,"w");
}
if(file == NULL)
{
perror("Error opening file");
exit(EXIT_FAILURE);
}
while(i<lines)
{
if(fgets (str,100, file)!= NULL )
{
if(caseSensitive)
{
if(strstr(str,pattern) != NULL)
{
if(outfile == NULL)
{
printf("%s",str);
} else
{
fprintf(out,"%s",str);
}
}
} else
{
if(strcasestr(str,pattern) != NULL)
{
if(outfile== NULL)
{
printf("%s",str);
} else
{
fprintf(out,"%s",str);
}
}
}
}
++i;
}
fclose(out);
fclose(file);
return 0;
}