ibilalkayy Ответов: 1

Как сопоставить входные данные и текст в файле?


В этом коде я хочу проверить вход и текст в файле должен быть сопоставлен, и если он будет сопоставлен, он должен дать мне сообщение об успехе и распечатать текст, в противном случае отказать в доступе.

int main(){
  FILE * fr = fopen("fiile.csv","r");
  char str[50], string[50];
  short int FLAG = 0;

  printf("Enter your name: ");
  fgets(str, sizeof(str), stdin);

  while (fgets(string, 49, fr)){
    if (strncmp(str, string, strlen(str)) == 0){
      printf("Here is your details");
      printf("%s", string);
      FLAG = 1;
    }
  }

  if (!(FLAG == 1)){
    printf("Access denied.\n");
    return -1;
  }
  fclose(fr);

  return 0;
}


Что я уже пробовал:

In this code, I want to check input and text in a file to be matched and if it is matched, it should give me a message of success and print the text, otherwise deny the access.

Sandeep Mewara

Это поможет вам, если вы поделитесь, где вы застряли во время попытки?

1 Ответов

Рейтинг:
10

Rick York

Если вы сопоставляете имена пользователей и пароли, то вы не хотите использовать strncmp. Вы должны убедиться, что они точно совпадают. Вы можете обнаружить, что при чтении входных данных в буфере остаются новые символы строки или возвращается каретка. Если это так, я нахожу, что это часто бывает, то напишите себе функцию, чтобы удалить их. Вот один из способов, которым вы можете это сделать, который не является особенно высокой производительностью :

void RemoveNewLines( char * buffer )
{
   char * ptr;
   ptr = strchr( buffer, '\n' );
   if( ptr )
       * ptr = 0;
   ptr = strchr( buffer, '\r' );   // in case you see carriage returns also
   if( ptr )
       * ptr = 0;
}
Затем вы можете изменить свой код, чтобы он выглядел следующим образом :
#define STRING_SIZE  49

int main()
{
  char instr[STRING_SIZE+1];
  char string[STRING_SIZE+1];
  FILE * fr = NULL;
  int flag = 0;

  fr = fopen("fiile.csv","r");
  if( fr == NULL )
  {
     printf( "Unable to open file\n" );
     return 1;
  }

  printf("Enter your name: ");
  fgets( instr, STRING_SIZE, stdin);
  RemoveNewLines( instr );

  while( fgets( string, STRING_SIZE, fr ) )
  {
     RemoveNewLines( string );
     if( strcmp( instr, string ) == 0 )
     {
      printf("Here is your details");
      printf("%s", string);
      flag = 1;
      break;
    }
  }

  fclose(fr);

  if( flag != 1 )
  {
    printf("Access denied.\n");
    return -1;
  }

  return 0;
}
Я думаю, что вижу в этом потенциальную проблему. Если ваш файл действительно является файлом .CSV и у вас есть другие элементы в той же строке (детали), то это никогда не будет совпадать. Однако вы не можете просто сделать ограниченный матч. Два имени "Джон" и "Джонатан" могли бы совпадать, если бы это делалось на ограниченной основе, так что это проблема.

Чтобы обойти эту проблему, предположив, что за именем пользователя в файле следует запятая, вы можете попробовать добавить запятую к записи пользователя. Тогда это заставит их совпадать с запятой, которая должна обеспечить точное совпадение имен пользователей. Эта ревизия может выглядеть так :
#define STRING_SIZE  49

int main()
{
  char instr[STRING_SIZE+1];
  char string[STRING_SIZE+1];
  FILE * fr = NULL;
  int flag = 0;
  size_t length = 0;

  fr = fopen("fiile.csv","r");
  if( fr == NULL )
  {
     printf( "Unable to open file\n" );
     return 1;
  }

  printf("Enter your name: ");
  fgets( instr, STRING_SIZE, stdin);
  RemoveNewLines( instr );

  strcat( instr, "," );     // append a comma to the user's entry
  length = strlen( instr );

  while( fgets( string, STRING_SIZE, fr ) )
  {
     RemoveNewLines( string );
     if( strncmp( instr, string, length ) == 0 )
     {
        flag = 1;
        break;      // no need to read any more, unless you want to
     }
  }

  fclose(fr);       // close the file - some OS don't like it if it isn't

  if( flag == 1 )   // I prefer positive logic
  {
     printf( "Your details :" );
     printf( "'%s'\n", string  );
     return 0;
  }

  printf("Access denied.\n");
  return -1;
}
С добавлением запятой ограниченное сравнение строк имеет смысл, предполагая, что имя следует за запятой в файле.


Rick York

Примечание : нет никакой гарантии, что это сработает, потому что я еще не пробовал и не могу, так как у меня нет вашего файла. Если это не сработает, то это даст хорошую возможность использовать отладчик.

KarstenK

лучше сравнить имя и пароль отдельно, чтобы сообщить пользователю о результате.

Rick York

Я согласен, но там не было никакого упоминания о пароле.

ibilalkayy

Эй, Рик, я использовал 2-й код, но проблема, с которой я столкнулся, заключается в том, что он принимает только первое слово, которое имеет запятую в конце. В файле есть много слов с запятыми в конце, но он принимает первое слово. Например, если бы я дал возможность ввести номер вашей идентификационной карты, который не является первым словом. Это может быть 2-е или 3-е слово в файле, тогда как я буду с ним обращаться?

Rick York

Чтобы сопоставить другие слова, вам придется отделить слова в каждой строке от файла. Обычно я использую для этого strtok, и вашим разделителем будет запятая. Он делает довольно глупый синтаксический анализ и будет ловить запятые в строках вроде этого, так что вам придется следить за этим. Это отдельный вопрос от того, что вы изначально задали, поэтому, если вы застряли, вам, вероятно, следует опубликовать еще один вопрос об этой части.

Rick York

Кстати - если вы считаете, что ваш вопрос ответил, то вы должны пометить его как таковой, чтобы он больше не казался открытым вопросом.