什么可以用来替换用C编写的这段代码中的if语句?

时间:2016-02-27 19:31:59

标签: c if-statement file-io

以下是我尝试扫描文件进行搜索并查看是否已输入用户名。由于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);
}

1 个答案:

答案 0 :(得分:0)

代码永远不会工作,特别是如果文件中的每个条目都是可变长度的。

相反,您应该在循环之前打开文件,跳过搜索(这几乎不会在文本文件中工作,尤其不是您显示它的使用方式)。然后,您可以读取字符串(使用fgetsfscanf)并与给定的用户名进行比较。

类似于以下伪代码:

file = open_file()
while (fscanf("%s", username_ext) == 1)
{
    if (strcmp(username, username_ext) == 0)
    {
        // Username found
    }
}

为了解释为什么代码(如问题所示)永远不会起作用,fseek调用将从一开始就将位置设置为文件中的偏移量x。该偏移量在 bytes 中,而不是在“records”或“elements”中。

如果输入文件是一个文本文件,其中每个记录的长度不同,则根本无法在不事先知道其位置的情况下寻找特定记录。