以下是我尝试扫描文件进行搜索并查看是否已输入用户名。由于if语句,代码不起作用。
for (x = 0; x < 100; x++) {
/* for loop allows the user to keep entering usernames until they come up with an unused username. */
FILE *userlist; /*The userlist file holds all the taken usernames */
userlist = fopen("userlist.txt", "r");
fseek(userlist, x, SEEK_SET); /* This starts the search at the place x, which is incremented each time. */
fscanf(userlist, " %s", &username_ext); /* This scans the file contents after x and stores it in the username_ext variable */
if (strcmp(username, username_ext) == 0) { /* If the username entered and the strings after the x are the same, the loop terminates. */
printf("\nThe username is already taken.");
break;
}
fclose(userlist);
}
答案 0 :(得分:0)
代码永远不会工作,特别是如果文件中的每个条目都是可变长度的。
相反,您应该在循环之前打开文件,跳过搜索(这几乎不会在文本文件中工作,尤其不是您显示它的使用方式)。然后,您可以读取字符串(使用fgets
或fscanf
)并与给定的用户名进行比较。
类似于以下伪代码:
file = open_file()
while (fscanf("%s", username_ext) == 1)
{
if (strcmp(username, username_ext) == 0)
{
// Username found
}
}
为了解释为什么代码(如问题所示)永远不会起作用,fseek
调用将从一开始就将位置设置为文件中的偏移量x
。该偏移量在 bytes 中,而不是在“records”或“elements”中。
如果输入文件是一个文本文件,其中每个记录的长度不同,则根本无法在不事先知道其位置的情况下寻找特定记录。