При выводе данных на экран дублируется последнее значение - 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.