我需要从目录中清除非活动用户,为此我创建了以下功能。
我目前有两个列表:各行的用户名(file1)和电子邮件(file2)地址。我需要查找file1中的用户名是否存在于file2的电子邮件地址列表中。
这些是我考虑过的步骤:
问题
( @ 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
答案 0 :(得分:4)
您在第二个while循环中读取了整个File2,但是您需要将File2中的内部指针重置回文件的开头以进行后续搜索,您可以通过在第二个while之后添加此行来执行此操作。 -loop:
rewind(file2);
或者如果您愿意:
fseek(file2, 0, SEEK_SET);