C程序没有读取.txt文件的用户名和密码

时间:2016-12-03 19:13:53

标签: c arrays string file

对于我的代码,我需要创建一个包含用户名(名字)和密码(姓氏)的.txt文件。我的代码需要读取该文件。如果我输入了正确的用户名和密码,它将登录。如果不正确,则不会登录。到目前为止,在我的name.txt文件中(包含我的用户名和密码的文件)我有

  勒布朗詹姆斯   乔史密斯   尼克戴维斯

如果我的用户名和密码正确,我希望它允许我登录。 当我运行我的代码时,我遇到了一个突发错误。我似乎无法在我的代码算法中找到问题。

//This is my code: 
#include <stdio.h>
#include <stdlib.h>

struct account {
  char id[20];
  char password[20];
};

static struct account accounts[10];

void read_file(struct account accounts[])
{
  FILE *fp;
  int i = 0;   // count how many lines are in the file
  int c;
  fp = fopen("names.txt", "r");
  while (!feof(fp)) {
    c = fgetc(fp);
    if (c == '\n')
      ++i;
  }
  int j = 0;
  // read each line and put into accounts
  while (j != i - 1) {
    fscanf(fp, "%s %s", accounts[j].id, accounts[j].password);
    ++j;
  }
}

int main()
{
  read_file(accounts);
  // check if it works or not
  printf("%s, %s, %s, %s\n",
    accounts[0].id, accounts[0].password,
    accounts[1].id, accounts[1].password);
  return 0;
}

1 个答案:

答案 0 :(得分:1)

您不需要提前知道行数。只需使用fscanf()读取一对名称和密码,直到它返回EOF

while (fscanf(fp, "%s %s", accounts[j].id, accounts[j].password) != EOF) {
    ++j;
}

另外,请勿使用feof()。它通常不会按照您的预期运作。 feof()仅在程序尝试读取文件并失败后才返回true值。也就是说,它不会阻止你的循环尝试读取文件的末尾。