Я кодирую программу для системы управления библиотекой как мой проект в c. Я использовал цикл while вместе с условием !feof
чтобы проверить файл для book
. Поскольку я читал, что мы не должны его использовать, и если мы должны, мы должны сделать это с некоторым заявлением о разрыве, а также с тех пор, как я читал большой нет. переменных из файла, которые я использовал для разрыва цикла while. всякий раз, когда Target
и book.bname
будут соответствовать (используя strcmp
), found
установлено в 1 и while цикл будет завершен. Это логика, которую я использовал за этим кодом. Здесь book
представляет собой структуру, из которой book.bname
является частью. Я использую linux os для этой программы. Скажите, пожалуйста, где я ошибаюсь?
void Searchbook() { int i; char Target[25],stats[3]; int Found=0; if((librecord=fopen("librecord.txt","r"))==NULL) printf(" ! The File is Empty...\n\n"); else { printf("\nEnter The Name Of Book : "); scanf("%s",Target); while(!feof(librecord)&& Found==0) { fscanf(librecord,"%d %s %s %d %d",&book.bid,book.bname,book.author,&book.status,&book.nooftitles); if(strcmp(Target,book.bname)==0) Found=1; for(i=0;i<book.nooftitles;i++) fscanf(librecord,"%s",book.titles); } if(Found) { if(book.status==IN) strcpy(stats,"IN"); else strcpy(stats,"OUT"); printf("\nThe Unique ID of The Book: %d\nThe Name of Book is: %s\nThe Author is: %s\nThe Book Status:%s\n\n",book.bid,book.bname,book.author,stats); } else if(!Found) printf("! There is no such Entry...\n"); fclose(librecord); } }
Это функция, в которой я столкнулся с бесконечным циклом после ввода имени книги. Он переходит в бесконечный цикл, печатая имя первой книги, с которой он сталкивается. Что я должен делать? моя проблема отличается от другого аналогичного вопроса, так как я использую только два условия, а не только !feof
. Я использую variable
как flag
Пока while loop
не завершается.
Вы не читаете следующую строку из файла, поскольку вы не продвигаетесь вообще. Вам нужно использовать fgets
для чтения строки из файла или fgetc
для чтения символа. fgets
автоматически останавливается при чтении нового символа строки, что может быть решением для чтения одной строки за раз. Другое решение, если вы используете GNU-версию библиотеки C, – это использовать [getLine] ( http://man7.org/linux/man-pages/man3/getdelim.3.html ), который читает строку для вас.
Независимо от того, что вы используете, вам нужно прочитать строку, а затем перейти к следующей строке до конца, и это не то, что вы делаете с вашим текущим кодом.