в приведенных ниже кодах я получаю только одну запись ... вместо того, чтобы найти все одну
Файл, который вы даете, содержит внешние представления, а не дампы (скрытые) 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 странные даты