【发布时间】:2019-03-27 20:48:35
【问题描述】:
我可以毫无问题地搜索随机访问文件,但问题是我不明白它实际上是如何工作的。
之前我使用方法搜索了一个随机访问文件
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 个测试用户有没有更好的方法来按字符串搜索这些文件,以便我可以读取它们并在文件中编辑它们,或者这是最好的方法,我在某个地方搞砸了?
【问题讨论】:
-
fseek和rewind在这里毫无意义。代码返回到文件的开头(倒带),然后立即转身回到与刚才完全相同的位置(fseek)。这两个调用可以直接删除。 -
fread()何时返回 EOF? -
Zing,偏移量被初始化为零,是的,所以它会从头开始并递增。我不确定指针位置是否会在迭代之间保持在相同的位置,所以我手动偏移它。