Я читаю файл, используя fgets. Мне нужно проверить каждую строку файла на соответствие регулярному выражению. Если есть небуквенно-цифровой символ, необходимо выйти из программы с отображением номера строки и «плохого» символа. То, что происходит, это выталкивание перед «плохим» персонажем. Вот мой файл .dat:
howard jim dave
joe
(
Maggie
Мой вывод программы:
file opened
Digit: howard jim dave
is not alphanumeric on line: 1
Exiting program!
File closed
То, что должно произойти, должно произойти в строке 3, поскольку вы можете видеть, что этого не происходит.
Вот мое регулярное выражение, которое находится в моем файле main.h:
#ifndef MAIN_H
#define MAIN_H
#ifdef __cplusplus
extern "C" {
#endif
#define BUFF 1024
#define to_find "^[a-zA-Z0-9]+$"
Вот мой файлCheck.c
#include "main.h"
int fileCheck(FILE *fp)
{
int ret_val;
int line_count = 0;
char file[BUFF];
regex_t regex;
if (regcomp(®ex, to_find, REG_EXTENDED) != 0)
{
fprintf(stderr, "Failed to compile regex '%s'\n", to_find);
return EXIT_FAILURE;
}
if (fp != NULL)
{
while (fgets(file, BUFF, fp))
{
line_count++;
if ((ret_val = regexec(®ex, file, 0, NULL, 0)) != 0)
{
printf("Digit: %s is not alphanumeric on line: %d\n", file, line_count);
printf("Exiting program!\n");
return EXIT_FAILURE;
}
}
}
}
Я не уверен, является ли проблема символом "\n" или нет. Я так не думаю. Я хорошо знаю, если isalnum(), но мне поручено регулярное выражение. Каким может быть возможное решение этой проблемы? Спасибо вам за ваши предложения.
РЕДАКТИРОВАТЬ: я хотел упомянуть, что когда я использовал fscanf вместо fgets, указанное выше регулярное выражение работало нормально. Причина изменения в том, что мне нужно подсчитать каждую строку. Если я прав, fscanf игнорирует символ новой строки. Мне нужен способ подсчета новой строки. Можно ли считать новый с помощью fscanf? Мой исходный цикл чтения файла был:
while (fscanf(fp, "%11023s", file) != EOF
{
line_count++;
if (regexec(®ex, file, 0, NULL, 0) != 0)
{
printf("%s%d wrong:\n, file, line_count);
return EXIT_FAILURE;
}
}
if ((ret_val = regexec(®ex, file, 0, NULL, 0)) != 0)
? Разве это не должно бытьif (regexec(®ex, file, 0, NULL, 0) != 0)
? - person Jerry   schedule 15.09.2013^[a-zA-Z0-9 ]+$
? (я думаю, что в этом случае лучше иметь\\s
) В противном случае, я думаю, что это больше о чтении построчно, чем о регулярном выражении, и я не могу здесь особо помочь :( Если, возможно, это ответ может помочь? - person Jerry   schedule 15.09.2013