2016-09-19 5 views
0

У меня есть текстовый файл, например, как «file_with_email.txt», который содержит следующие адреса электронной почты:поиск электронной почты в текстовом файле

crp.edu 
src.net 
abc.edu 

мне нужно искать по электронной почте в данном текстовом файле. проблема с моим кодом заключается в том, что при вводе адреса электронной почты с полным доменным именем, например, если я ищу, например, «abc.edu», тогда он вернет сообщение как «найденное электронное письмо», что является правильным.

Но в случае, если я введи адрес электронной почты с неполным или частичным доменным именем, например, «abc.ed», в качестве ввода, который не содержится в данном файле, он печатает тот же результат, что и «найденный email» «даже если такого письма нет.

Кроме того, есть случаи, когда электронные письма были бы как «abc.edu.net» в качестве входа пользователя. В этом случае мой код печатает тот же вывод, что и «email found», который не содержится в данном текстовом файле. Я был бы признателен за любую помощь в решении этой проблемы.

Ниже приводится функция для поиска электронной почты в текстовый файл, который я пытался до сих пор:

int search_mail(char *email) 
{ 
FILE *fp; 
int line = 1; 
int number_of_match = 0; 
char temp[512]; 
char *fname = "/home/file_with_email.txt"; 
    if((fp=fopen(fname, "r"))==NULL) 
    { 
    return(-1); 
    } 

    while(fgets(temp, 512,fp) !=NULL) 
    { 
    fprintf(stdout, "Just read: %s\n", temp); 
     if(strstr(temp, email) !=NULL) 
     { 
     printf("\n The match is found in the file\n "); 
     //printf("\n %s \n", temp); 
     number_of_match++; 
     } 
     //line++; 
    } 

    if(number_of_match == 0) 
     printf("\n No result found"); 

     //close the file if it is open. 

    if(fp) 
     { 
     fclose(fp); 
    } 
    } 
+0

Это помогло бы выравнивал код –

+0

Вам не нужно 'если (FP)', как это всегда будет истинным –

+0

'fprintf (stdout' -' printf' будет делать –

ответ

1

Основываясь на ответе @ grek40, вы можете выполнить поиск по mmap() файлам в POSIX-совместимой системе (обратите внимание, что я не учитывал соответствующие файлы заголовков и всю проверку ошибок, чтобы попытаться устранить любую полосу прокрутки кода панель):

int startsWithWhitespace = 0; 
int endsWithWhitespace = 0; 
int fd = open(filename, O_RDONLY); 
struct stat sb; 
fstat(fd, &sb); 
// size + 1 is needed to ensure the mapped file ends with at least one \0 character 
char *data = mmap(NULL, sb.st_size + 1, PROT_READ, MAP_PRIVATE, fd, 0); 
close(fd); 
char *match = strstr(data, string); 
// found a potential match 
if (match) 
{ 
    // check if it's the first char in the file else check the first character *before* the match 
    if (match == data) 
    { 
     startsWithWhiteSpace = 1; 
    } 
    else 
    { 
     startsWithWhitespace = isspace(*(match - 1)); 
    } 
    // get the character one past the end of the matched string 
    char *end = match + strlen(string); 
    // ensure that the end char is not \0 else the string is at the end of the file 
    if (*end) 
    { 
     endsWithWhitespace = isspace(*end); 
    } 
    else 
    { 
     endsWithWhitespace = 1; 
    } 
} 
... 

в конце концов, если match не равен нулю, и оба startsWithWhitespace и endsWithWhitespace отличны от нуля, полная строка была согласованы.

Редактирование: чтобы быть тщательным, вам также необходимо проверить предыдущий и следующий символы на список знаков препинания, которые вы не считаете частью длинной строки.

Предполагая, что вы собираетесь искать файл несколько раз, это идеальное использование mmap(). Код для поиска файла: simple, вы можете обрабатывать файл как одну длинную строку и не беспокоиться о чтении ее частей или о том, как проверить, пересекает ли строка два последовательных буфера чтения. Поиск огромного файла, вероятно, будет медленнее, чем может быть, если вы действительно настроите операции ввода-вывода, но это так просто и легко, что, вероятно, это лучший способ сделать это.

0

Кажется, вы в основном хотят, чтобы найти строку таким образом, что он либо окружен пробелами или расположенный в начале/конце текста.

Итак, вам нужно следить за символом перед началом вашего искомого текста и положением первого символа возможного результата. Затем, когда у вас есть возможный результат, проверьте, находится ли он в начале или в конце, затем проверьте символ перед запуском и после окончания с isspace(char). Вам также нужно будет проверить на наличие реальных совпадений в строке, если первая ложная совпадения (не окруженная пробелами).

Другая проблема с вашим текущим подходом заключается в том, что вы рискуете получить результат, начиная с первых 512 символов и заканчивая следующими 512 символами. Вы не найдете результата в такой ситуации в настоящее время.

Смежные вопросы