Как искать все конкретное содержимое из записи в c - PullRequest
0 голосов
/ 07 июля 2019

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

void recsearch()
{
    FILE *fp;
    char emp[50];
    fp=fopen("C:\\New folder\\babarecord.dat","r");

    printf("Name of record : ");
    gets(emp);
    rewind(fp);
    while (fread(&a,sizeof(a),1,fp)!=NULL)
    {
        if(strcmp(a.name,emp)==0)
        {
            printf("%s   %s  %f\n\n\n\n",a.name,a.date,a.amount);
        }
        else
        {
            printf("Succesfully printed everything");
            getch();
        }
    }

}

babarecord.dat содержит записи типа

  sam     565    656
  ram     7565   5686
  sam     789    5658

1 Ответ

0 голосов
/ 07 июля 2019

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

Файл, который вы даете, содержит внешние представления, а не дампы (скрытые) struct , вы не можете использовать fread для чтения содержимого.

Вы говорите, что получили, формат указывает, что одно поле является _float, невозможно правильно прочитать значение с плавающей запятой, также имя чтения не может чудесным образом содержать нулевой символ для его завершения, так что strcmp будет not возвращает 0, и это также очень вероятно невозможно, размер вашей struct совместим с размером каждой строки, включенной новой строкой, потому что они, кажется, имеют различную длину. Для меня вы никогда не найдете ожидаемую запись.

В ветви else печать «Успешно напечатано все» не имеет смысла, это не потому, что strcmp не возвращает 0, что вы закончили читать все записи, а затем распечатали все. В этом случае вы также вызываете getch , чье выполнение блокируется в случае, если все буферизованные входы были прочитаны.

Перемотка бесполезна, потому что вы просто открываете файл, и вы в начале.

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


Способ может быть (файл задается параметром, а не указывать его путь через буквенную строку в коде), включая вероятное определение struct , совместимой с кодом, который вы даете:

#include <stdio.h>
#include <string.h>

typedef struct Record {
  char name[50];
  char date[10];
  float amount;
} Record;

int main(int argc, char ** argv)
{
  if (argc != 2)
    printf("Usage: %s <file>\n", *argv);
  else {
    FILE * fp = fopen(argv[1],"r");

    if (fp == NULL)
      fprintf(stderr, "cannot open \"%s\"\n", argv[1]);
    else {
      char emp[50];

      printf("Name of record : ");

      if (scanf("%49s", emp) == 1) { /* or use fgets then remove the newline */
        Record a;

        while (fscanf(fp, "%49s %9s %f", a.name, a.date, &a.amount) == 3) {
          if(strcmp(a.name, emp)==0)
            printf("%s %s %f\n", a.name, a.date, a.amount);
        }

        puts("all was read");
        /* add getch(); if you want */
      }

      fclose(fp);
    }
  }
}

с вашим файлом babarecord.dat , компиляция и выполнение

gcc  -pedantic -Wall -Wextra -Werror c.c
pi@raspberrypi:/tmp $ ./a.out
Usage: ./a.out <file>
pi@raspberrypi:/tmp $ ./a.out babarecord.dat
Name of record : aze
all was read
pi@raspberrypi:/tmp $ ./a.out babarecord.dat
Name of record : sam
sam 565 656.000000
sam 789 5658.000000
all was read
pi@raspberrypi:/tmp $ ./a.out babarecord.dat
Name of record : ram
ram 7565 5686.000000
all was read
pi@raspberrypi:/tmp $ 

P.S. 565, 7565 и 789 странные даты

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