尝试使用字符串搜索随机访问文件

时间:2019-03-27 20:48:35

标签: c file search io

我可以搜索随机访问文件而没有任何问题,但是问题是我不了解它的实际工作方式。

以前,我是使用

方法搜索随机访问文件的
 FILE fpnt = fopen(FILE_NAME, "rb+");

 User tempUser = {"", "", 0, "", 0};
 printf("Enter the id number of the user to find\n");
 scanf("%d", idNum);
 fseek(fpnt, (idNum - )* sizeof(User), SEEK_SET);
 fread(&tempUser, sizeof(User), 1, fpnt) != EOF && found == 0;

当屁股的偏移量不一定与我假定的ID相同时,我不明白如何总是找到正确的用户。但是问题出在我尝试使用非整数数据访问文件时。

例如,我正在尝试通过用户名(字符串)来查找用户。我使用的方法如下:

 typedef enum tUserLevel {
     MANAGER = 1,
     CLERK = 0,
     NOTFOUND = 9001
 }level;


 typedef struct tUser {
     char userName[20];
     char password[20];
     level priviledgeLevel;
 }User;

do {
    fseek(fpnt, offSet * sizeof(User), SEEK_SET);
    if (fread(&tempUser, sizeof(User), 1, fpnt) == EOF)
        endOfFile = EOF;        
    rewind(fpnt);
    offSet++;
} while (endOfFile!=EOF && !strcmp(username, tempUser.userName));

if (endOfFile==EOF&& strcmp(username, tempUser.userName)) {
    printf("The User was not found\n");
    return noUser;

    //return noUser;
}

因此,应该发生的情况是该文件将检查每个用户的输入用户名(即名为username的变量),并将两者进行比较,如果两者均正确,则停止。我不确定这实际上是如何循环的,或者偏移是否以我想要的方式影响文件中的指针。发生的事情是,我总是得到EOF,因此即使在读取一次之后,该部分代码也始终会运行。我有4个测试用户,是否有更好的方法来按字符串搜索这些文件,以便我可以读取它们并在文件中进行编辑,或者这是最好的方法,所以我将其弄乱了吗?

1 个答案:

答案 0 :(得分:0)

您的第一个示例假设该文件由固定长度的User记录组成,这些记录按id号排列,没有空格。 id 1的记录将在偏移量0处,而id N的记录将在(N - 1) * sizeof(User)处。如果那是文件实际包含的内容,则这是一个合理的假设。

您问题底部的代码似乎正在遭受身份危机。它无法确定记录是否是连续的并按ID排序,或者是否需要通过在username上进行匹配来搜索文件。这是两种不同的查找方法的不可行组合。您需要选择一种方法并继续使用它。

如果文件按ID排序且不包含空格(并且您要按ID搜索),则无需在while循环中进行搜索。

另一方面,如果文件无序或包含空格,则有必要进行搜索。在那种情况下,则不需要fseekrewind调用。只需从文件开头开始,然后依次读取每条记录,一次一次,直到找到与请求的用户名匹配的记录。

同样,将freadEOF的返回值进行比较是错误的。 fread函数返回实际读取的项目数。如果返回的数字不等于您在调用中指定的项目数,则可能是读取错误,或者您到达了文件末尾。 EOF常量适用于返回{em> character 值的fgetc之类的函数。