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

问题描述 投票:0回答:1

我可以搜索随机访问文件没有任何问题,但问题是我不明白它是如何工作的。

以前我使用该方法搜索随机访问文件

 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个测试用户是否有更好的方法来搜索这些文件的字符串,所以我可以阅读它们并在文件中编辑它们或这是最好的方式,我搞砸了什么?

c file search io
1个回答
0
投票

你的第一个例子是假设文件由固定长度的User记录组成,按id号排列,没有间隙。 id 1的记录位于偏移0处,id N的记录位于(N - 1) * sizeof(User)。如果这是文件实际包含的内容,这是一个合理的假设。

你问题底部的代码似乎正遭受身份危机的困扰。它无法弄清楚记录是按顺序排序还是按ID排序,或者是否需要通过匹配username来搜索文件。这是两种不同查找方法的不可行的混合。你需要选择一种方法并继续使用它。

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

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

此外,比较freadEOF的回报值是错误的。 fread函数返回实际读取的项目数。如果返回的数字不等于您在调用中指定的项目数,则表明存在读取错误,或者您已经到达文件末尾。 EOF常量用于返回字符值的fgetc等函数。

© www.soinside.com 2019 - 2024. All rights reserved.