我可以搜索随机访问文件没有任何问题,但问题是我不明白它是如何工作的。
以前我使用该方法搜索随机访问文件
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个测试用户是否有更好的方法来搜索这些文件的字符串,所以我可以阅读它们并在文件中编辑它们或这是最好的方式,我搞砸了什么?
你的第一个例子是假设文件由固定长度的User
记录组成,按id号排列,没有间隙。 id 1的记录位于偏移0处,id N
的记录位于(N - 1) * sizeof(User)
。如果这是文件实际包含的内容,这是一个合理的假设。
你问题底部的代码似乎正遭受身份危机的困扰。它无法弄清楚记录是按顺序排序还是按ID排序,或者是否需要通过匹配username
来搜索文件。这是两种不同查找方法的不可行的混合。你需要选择一种方法并继续使用它。
如果文件按id排序并且不包含间隙(并且您按id搜索),则无需在while
循环中进行搜索。
另一方面,如果文件无序或包含间隙,则需要进行搜索。在那种情况下,然后不需要fseek
和rewind
调用。只需从文件的开头开始,按顺序读取每个记录,一次一个,直到找到与所请求的用户名匹配的记录。
此外,比较fread
与EOF
的回报值是错误的。 fread
函数返回实际读取的项目数。如果返回的数字不等于您在调用中指定的项目数,则表明存在读取错误,或者您已经到达文件末尾。 EOF
常量用于返回字符值的fgetc
等函数。