Бинарный файл. Поставить последнее число из этого файла между 10-м и 11-м компонентами - C (СИ)
Формулировка задачи:
4. Компоненты бинарного файла – вещественные числа. Поставить последнее число из этого файла между 10-м и 11-м компонентами.
Вот листинг
у меня никак не получается сдвинуть элементы после вставки между 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-м компонентами»
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; }
Объяснение кода листинга программы
- Объединение всех чисел в массив и запись этого массива в файл
- Перемещение всех чисел на одну позицию вперед
- Запись последнего числа между 10-м и 11-м числами
- Чтение всех чисел из файла
- Закрытие файла
- Возврат 0, чтобы указать, что программа успешно завершилась