Найти ошибку в реализации файлового ввода-вывода - 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);
}
....
Объяснение кода листинга программы
- В цикле, пока файл
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с пробелом в конце. Таким образом, в первой части кода ищется положительное число, во второй - неравное нулю.
- Переменная
- Переменная