我可以搜索随机访问文件而没有任何问题,但是问题是我不了解它的实际工作方式。
以前,我是使用
方法搜索随机访问文件的 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个测试用户,是否有更好的方法来按字符串搜索这些文件,以便我可以读取它们并在文件中进行编辑,或者这是最好的方法,所以我将其弄乱了吗?
答案 0 :(得分:0)
您的第一个示例假设该文件由固定长度的User
记录组成,这些记录按id号排列,没有空格。 id 1的记录将在偏移量0处,而id N
的记录将在(N - 1) * sizeof(User)
处。如果那是文件实际包含的内容,则这是一个合理的假设。
您问题底部的代码似乎正在遭受身份危机。它无法确定记录是否是连续的并按ID排序,或者是否需要通过在username
上进行匹配来搜索文件。这是两种不同的查找方法的不可行组合。您需要选择一种方法并继续使用它。
如果文件按ID排序且不包含空格(并且您要按ID搜索),则无需在while
循环中进行搜索。
另一方面,如果文件无序或包含空格,则有必要进行搜索。在那种情况下,则不需要fseek
和rewind
调用。只需从文件开头开始,然后依次读取每条记录,一次一次,直到找到与请求的用户名匹配的记录。
同样,将fread
与EOF
的返回值进行比较是错误的。 fread
函数返回实际读取的项目数。如果返回的数字不等于您在调用中指定的项目数,则可能是读取错误,或者您到达了文件末尾。 EOF
常量适用于返回{em> character 值的fgetc
之类的函数。