Попытка поиска файла произвольного доступа с использованием строки - PullRequest
0 голосов
/ 27 марта 2019

Я могу искать файл произвольного доступа без каких-либо проблем, но проблема в том, что я не понимаю, как он на самом деле работает.

Ранее я искал файл произвольного доступа, используя метод

 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 голосов
/ 28 марта 2019

Ваш первый пример предполагает, что файл состоит из записей User фиксированной длины, упорядоченных по номеру идентификатора, без пробелов.Запись для идентификатора 1 будет иметь смещение 0, а запись для идентификатора N будет иметь значение (N - 1) * sizeof(User).Если это то, что на самом деле содержится в файле, это разумное предположение.

Код в нижней части вашего вопроса, похоже, страдает от кризиса идентификации.Невозможно определить, являются ли записи последовательными и упорядоченными по идентификатору, или же необходимо найти файл, сопоставив его по username.Это неработоспособный гибрид двух разных методов поиска.Вам нужно выбрать один метод и пойти с ним.

Если файл упорядочен по идентификатору и не содержит пробелов (и вы ищете по идентификатору), вам не нужно искать в цикле while.

С другой стороны, если файл неупорядочен или содержит пробелы, необходимо выполнить поиск.В этом случае вызовы fseek и rewind не нужны.Просто начните с начала файла и читайте каждую запись последовательно, по одной, пока не найдете ту, которая соответствует запрошенному имени пользователя.

Кроме того, сравнение возвращаемого значения fread с EOFнеправильно.Функция fread возвращает количество фактически прочитанных элементов.Если возвращаемое число не равно количеству элементов, которые вы указали в вызове, то либо произошла ошибка чтения, либо вы достигли конца файла.Константа EOF предназначена для использования с такими функциями, как fgetc, которые возвращают символ значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...