Бинарный файл. Поставить последнее число из этого файла между 10-м и 11-м компонентами - C (СИ)

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

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

4. Компоненты бинарного файла – вещественные числа. Поставить последнее число из этого файла между 10-м и 11-м компонентами. Вот листинг
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<process.h>
#include<conio.h>
void Datfile(void);
int main()
{
    FILE *fin;
    int i=0,t=0,m=0;
    float n,k;
    srand(time(0));
    Datfile();
    fin=fopen("file.dat","r+b");
    if(fin==NULL) exit(1);
    printf("OLD\n");
    while(fread(&n,sizeof(float),1,fin))
    { 
        printf("%.2f\t",n);
        i++;    
        
    }
    t=i;
    for(m=t;m>10;m--)
 
        fseek(fin,ftell(fin),SEEK_SET);
    fwrite(&n,sizeof(float),1,fin);
 
    printf("\nNEW\n");
rewind(fin);
while(fread(&n,sizeof(float),1,fin))
    { 
        printf("%.2f\t",n);
    }
printf("\n");
 fclose(fin);
    return 0;
 
}
void Datfile(void)
{
    FILE *f;
    int n,k;
        float a;
    f=fopen("file.dat","wb");
    if(f==NULL) exit(1);
    k=14;//rand()%101;
    for(n=0;n<k;n++)
    {
        a=(rand()%1001-500)/10.0;
        fwrite(&a,sizeof(a),1,f);
    }
    fclose(f);
}
у меня никак не получается сдвинуть элементы после вставки между 10 и 11 элементами(

Решение задачи: «Бинарный файл. Поставить последнее число из этого файла между 10-м и 11-м компонентами»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
 
 
int main()
{
    FILE *f;
    double test[20];
    srand (time(NULL));
 
    for (int i=0; i<20; i++)
        {
            test[i] = (double)(rand() % 100) / (double)(rand() % 200);
            printf("test[%d]=%f\r\n",i,test[i]);
    }
 
    // запись в файл массива слючайных чисел
    f = fopen("test.dat","wb");
    fwrite(test,sizeof(test),1,f);
    fclose(f);
 
    f = fopen("test.dat","r+b");
    fseek(f,0,SEEK_SET);
    double d,s_last;
    int s_pos;
    for (int i=0; i<20; i++)
    {
        fread((double *)&d,sizeof(double),1,f);
        printf("readed test[%d]=%f\r\n",i,d);
        s_pos = i;
    }
    // сохранение последнего элемента
    s_last = d;
    printf("last element=%f last position=%d\r\n",s_last,s_pos);
    
    // перемещение всех элементов на 1 позицию
    for (int i=s_pos; i>=11; i--)
    {
        fseek(f,(i-1)*sizeof(double),SEEK_SET);
        fread((double *)&d,sizeof(double),1,f);
        fseek(f,(0 /*на какую позицию перенести числа */)*sizeof(double),SEEK_CUR); 
        fwrite((double *)&d,sizeof(double),1,f);
    }
 
    // запись последнего элемента в 11 место
    fseek(f,(11-1)*sizeof(double),SEEK_SET);
    fwrite((double *)&s_last,sizeof(double),1,f);
    fclose(f);
 
    //контрольное чтение
    f = fopen("test.dat","rb");
    for (int i=0; i<20; i++)
    {
        fread((double *)&d,sizeof(double),1,f);
        printf("readed test[%d]=%f\r\n",i,d);
    }
 
    fclose(f);
 
   return 0;
}

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

  1. Объединение всех чисел в массив и запись этого массива в файл
  2. Перемещение всех чисел на одну позицию вперед
  3. Запись последнего числа между 10-м и 11-м числами
  4. Чтение всех чисел из файла
  5. Закрытие файла
  6. Возврат 0, чтобы указать, что программа успешно завершилась

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

7   голосов , оценка 3.714 из 5
Похожие ответы