При выводе данных на экран дублируется последнее значение - C (СИ)
Формулировка задачи:
Программа считывает,добавляет и ищет данные из бинарного файла.Проблема заключается в том что при выводе данных на экран дублируется последнее значение.Не могу понять почему так выводит.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define ERROR_OPEN_FILE -3 #define SIZE 30 char path[256]; void main(int argc, char *argv[]) { FILE *iofile = NULL; char names[80]; char name[80]; int answer; char s[] = "numbers.bin"; unsigned long counter; int i, num; int pos; int value = 0; int menu; int yn; start: printf("Got %d arguments\n", argc); for(i=0;i<argc;i++) { puts(argv[i]); } if(argc>1) { for(yn=0;yn<strlen(argv[1]);yn++) {s[yn]=argv[1][yn];}} else{ printf("Input the file name:"); scanf("%s",s); iofile = fopen(s,"ab+"); if (iofile == NULL) { printf("Error opening file"); getch(); exit(ERROR_OPEN_FILE); }} printf("\nDo your selection:\n1.List\n2.Add\n3.Find\n4.Exit\n"); printf("Selection: "); scanf("%d",&menu); if (menu==1){ label1: do { fread(&value, sizeof(long), 1, iofile); printf("%d ", value); } while(!feof(iofile)); fclose(iofile); printf ("\nSelect an option: 1-Continue or 0-Exit\n"); scanf("%d",&answer); if(answer == 1) {goto start;} else {goto exit;}} else if(menu==2){ (scanf ("%d", &value) != EOF); fwrite(&value,sizeof(long),1,iofile); fclose(iofile); printf ("\nSelect an option: 1-Continue or 0-Exit\n"); scanf("%d",&answer); if(answer == 1) {goto start;} else {goto exit;} } else if(menu==3){label3: num=0; printf("Enter the name:\n"); scanf("%d",name); while(!feof(iofile)) {fread(&names,sizeof(long),1,iofile); if (!strcmp(name, names)) num=num+1; }printf("Matches found %d\n",num); printf ("\nSelect an option: 1-Continue or 0-Exit\n"); scanf("%d",&answer); if(answer == 1) {goto start;} else {goto exit;} } else if(menu==4);{ exit: exit(0);} fclose(iofile); }
Решение задачи: «При выводе данных на экран дублируется последнее значение»
textual
Листинг программы
if (!feof(iofile)) printf("%d ", value);
Объяснение кода листинга программы
- В условии используется оператор
!
, который инвертирует результат выраженияfeof(iofile)
. Это означает, что проверка на конец файлаfeof(iofile)
возвращает0
(ложь), если в файле еще есть данные для чтения. - В функции
printf
передается строка формата%d
(без кавычек), которая указывает на то, что нужно вывести целочисленное значение. - Переменная
value
передается в функциюprintf
для вывода на экран. - Значение
value
дублируется на экране, так как после вывода каждого значения функцияprintf
возвращает значение, которое используется в качестве аргумента для повторного вызова функцииprintf
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д