C:查找file1中的用户名是否存在于包含电子邮件的file2中

时间:2016-03-03 10:39:30

标签: c list compare

我需要从目录中清除非活动用户,为此我创建了以下功能。

我目前有两个列表:各行的用户名(file1)和电子邮件(file2)地址。我需要查找file1中的用户名是否存在于file2的电子邮件地址列表中。

这些是我考虑过的步骤:

  1. 从file1读取第一个用户名并删除换行符。
  2. 开始阅读文件2中的电子邮件地址,在" @"符号和比较。
  3. 如果比较成功,请插入" ##"在file1中签名用户名前面。 (如何实现?)
  4. 问题

    @ MC93回答解析)我目前陷入第2步。我的程序只是比较file1中的第一个用户名,然后停止比较。程序通常存在。

    当前问题是Step3和改进!!

    另外,我应该阅读文件2分割单词并将它们存储在已排序的平衡树中以提高性能。如果没有,任何其他建议。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main ( int argc, char** argv )
    {
        FILE * file1;
        FILE * file2;
        char * lineFromFile1 = NULL;
        char * lineFromFile2 = NULL;
        size_t len = 0;
        ssize_t read1, read2;
        char * token;
        char * search = "@";
    
        file1 = fopen("username.txt", "r");
        file2 = fopen("email.txt", "r");   
        if ( file1 == NULL || file2 == NULL )
        {
            exit(EXIT_FAILURE);
        }
    
        while ((read1 = getline(&lineFromFile1, &len, file1)) != -1)
        {
            // Removing the newline character
            if (lineFromFile1[strlen(lineFromFile1)-1] == '\n')
            {
                lineFromFile1[strlen(lineFromFile1)-1] = '\0';
            }
            printf("\nCurrent Username: %s \n", lineFromFile1);
    
            // Reading email addresses and comparing
            while ((read2 = getline(&lineFromFile2, &len, file2)) != -1)
            {
                // Splitting string at the '@' sign
                token = strtok(lineFromFile2, search);
    
                // Comparing strings
                if ( strcmp(lineFromFile1, token) == 0)
                {
                    printf("%s from File1 exists in File2 \n", lineFromFile1);
                }
    
                token = strtok(NULL, lineFromFile2);
                token = NULL;
            }
            rewind(file2);
        }
    
        fclose(file1);
        fclose(file2);
        if ( lineFromFile1 || lineFromFile2 || token)
        {
            free(lineFromFile1);
            free(lineFromFile2);
            free(token);
        }
    }
    

    文件内容

    File1                            File2
    username                         email
    janedoe                          johndoe@google.com
    johndoe                          janedoe@google.com
    
    Current Username: janedoe 
    janedoe from File1 exists in File2 
    
    Current Username: johndoe 
    
    RUN FINISHED; exit value 0; real time: 10ms; user: 0ms; system: 0ms
    

1 个答案:

答案 0 :(得分:4)

您在第二个while循环中读取了整个File2,但是您需要将File2中的内部指针重置回文件的开头以进行后续搜索,您可以通过在第二个while之后添加此行来执行此操作。 -loop:

rewind(file2);

或者如果您愿意:

fseek(file2, 0, SEEK_SET);