Найти ошибку в реализации файлового ввода-вывода - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ошибка заключается в том, что на этом промежутке
while(fread(&a,sizeof(int),1,f))
{
if(a!=0)fwrite(&a,sizeof(int),1,g);
printf("%d ",a);
}
Не идёт запись(((Я не знаю что делать, через отладку этот отрезок вообще пропускается( Вот код создания бин файла, сначала его запускать, это надо для выполнения главной программы
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<stdlib.h>
#include<time.h>
       float random (int N)
      {return rand() % N;}
       const int N=10;
int main(void)
{
int i=0,j;
FILE *f=fopen("chisla.bin","wb");
int a;
    srand(time(NULL));
                  if (f==NULL) printf ("Error\n");
                  else
                  {
 for(i=0;i<10;i++)
 {
                  a=rand()%19-9;
                  fwrite (&a,sizeof(int),1,f);
                  printf ("%d ",a);
 }
                  }
fclose(f);
getch();
return 0;
}
Вот собственно программа из-за которой одни беды
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
 
int main(void)
{
int i=0,j,x=1,flaq=0,flag=0,z=0;
FILE *f=fopen("chisla.bin","rb");
FILE *g=fopen("chisla1.bin","wb");
int a;
if (f==NULL) printf ("Error\n");else
while(fread(&a,sizeof(int),1,f))
{
if(a>0)flaq++;
if(a<0)flag++;
}
fwrite(&flag,sizeof(int),1,g);
printf("%d ",flag);
while(fread(&a,sizeof(int),1,f))
{
if(a!=0)fwrite(&a,sizeof(int),1,g);
printf("%d ",a);
}
fwrite(&flaq,sizeof(int),1,g);
printf("%d",flaq);
fclose(f);
fclose(g);
getch();
return 0;
}
Задачка полезна в обучении файловой записи, можно юзать в обучении))) Собственно текст задачи: "Компоненты типизированного файла – целые числа. Удалить из него все нули. Добавить в начало файла количество отрицательных компонентов, а в конец – количество положительных." Заранее спасибо за помощь и скорейшие отзывы =)

Решение задачи: «Найти ошибку в реализации файлового ввода-вывода»

textual
Листинг программы
....
while(fread(&a,sizeof(int),1,f))
{
if(a>0)flaq++;
if(a<0)flag++;
}
fwrite(&flag,sizeof(int),1,g);
printf("%d ",flag);
fseek(f,0,SEEK_SET);//! 
while(fread(&a,sizeof(int),1,f))
{
if(a!=0)fwrite(&a,sizeof(int),1,g);
printf("%d ",a);
}
....

Объяснение кода листинга программы

  1. В цикле, пока файл f не пуст (fread возвращает 1), выполняются следующие действия:
    • Переменная a читается из файла f как целое число (типа int).
    • Если a больше 0, то переменная flaq увеличивается на 1.
    • Если a меньше 0, то переменная flag увеличивается на 1.
    • Данные из файла f записываются в файл g как целое число (типа int).
    • Выводится значение переменной flag с пробелом в конце.
    • Файловый указатель f возвращается к началу файла (SEEK_SET, 0).
    • В цикле, пока файл f не пуст (fread возвращает 1), выполняются следующие действия:
      • Переменная a читается из файла f как целое число (типа int).
      • Если a не равно 0, то данные из файла f записываются в файл g как целое число (типа int).
      • Выводится значение переменной a с пробелом в конце. Таким образом, в первой части кода ищется положительное число, во второй - неравное нулю.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.667 из 5