Открытие файла на С для чтения - PullRequest
0 голосов
/ 26 апреля 2018

У меня проблема с программированием на C, и я хотел бы получить огромную помощь от всех вас.

Я должен написать консольное приложение, которое будет управлять человеческими ресурсами.Предполагается, что приведенный ниже код проверяет, существует ли файл userlist.txt и читает ли он из него.Код успешно компилируется и связывается, но при его выполнении возникает ошибка сегментации.

bool userListAvailable() {
  bool userListExist = false;
  struct user_details userlist[number_of_employee];
  FILE *userListFile=fopen("userlist.txt", "w");
  if (!(userListFile == NULL)) {
    fread(userlist, sizeof (userlist), 1, userListFile);
    for (int i = 0; i < sizeof (userlist); ++i) {
        if (strstr(userlist[i].email, "@") != NULL) {
            userListExist = true;
            break;
        }
    }
  }
  fclose(userListFile);
  return userListExist;
}

Есть идеи, что я делаю неправильно?Я попробовал несколько других почти похожих вопросов, но это было напрасно.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Если вы хотите проверить, существует ли файл userlist.txt, вы можете проверить его с помощью Open.
Open вернет новый дескриптор файла или -1, если произошла ошибка (в этом случае errno устанавливается соответствующим образом). Вот мужчина http://man7.org/linux/man-pages/man2/open.2.html
Затем, если FD (дескриптор файла) и возвращаемое значение open отличаются от -1, это означает, что файл существует и вы успешно открыли его, поэтому вы можете прочитать его с помощью FD.

0 голосов
/ 26 апреля 2018

В дополнение к обсуждению наверху

for (int i = 0; i < sizeof(userlist); ++i) {

Скорее всего, неправильно, так как вы хотите прочитать number_of_employee, а не количество байтов в буфере.

Скорее всего, вы получите segfault на userlist[i], так как sizeof(userlist), вероятно, больше, чем number_of_employee

...