Создать файл f, компонентами которого являются 10 целочисленных массивов - C (СИ)

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

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

Помогите написать. Создать файл f, компонентами которого являются 10 целочисленных массивов a1,.., a10, заполненных случайными числами. Требуется преобразовать каждый из массивов, заменив наибольший элемент нулем. Полученные массивы должны быть записаны в тот же самый файл f. Разрешается использовать вспомогательный файл g.

Решение задачи: «Создать файл f, компонентами которого являются 10 целочисленных массивов»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define NUM_OF_ARRAYS 10
#define SIZE_OF_ARRAY 12
 
int* createArray(size_t sz);
void fillArray(int* a, size_t sz);
int* readArray( FILE* file, size_t sz);
void writeArray(FILE* file, int* a, size_t sz);
int max(int *a, size_t sz);
void replaceMax(int *a, size_t sz);
void printArray(int* a, size_t sz);
void check_file(FILE* file);
void check_array(int* a);
void createFile(FILE* file, const char *fn);
void modifyFile(FILE *f);
 
int main(){
    FILE *f=NULL;
    srand(time(0));
    createFile(f, "data.dat");
    puts("----------------------------------");
    modifyFile(f);
    return 0;
    }
    
void modifyFile(FILE *file){
    size_t i=0, n=SIZE_OF_ARRAY;
    long rpos, wpos;
    file=fopen("data.dat", "r+b");
    check_file(file);
    for(i=0; i<NUM_OF_ARRAYS; ++i){
        wpos=ftell(file);
        int *b=readArray(file, n);
        check_array(b);
        rpos=ftell(file);
        replaceMax(b,n);
        fseek(file, wpos, SEEK_SET);
        writeArray(file, b, n);
        fseek(file, rpos, SEEK_SET);
        free(b);
    }
    rewind(file);
    for(i=0; i<NUM_OF_ARRAYS; ++i){
        int *b=readArray(file, n);
        check_array(b);
        printArray(b,n);
        free(b);
    }
}
 
 
void createFile(FILE* file, const char *fn){
    size_t i=0;
    size_t n=SIZE_OF_ARRAY;
    file=fopen(fn, "wb");
    check_file(file);
    for(i=0; i<NUM_OF_ARRAYS; ++i){
        int *a=createArray(n);
        printArray(a,n);
        writeArray(file, a, n);
        free(a);
    }
    fclose(file);
}
    
void check_array(int* a){
    if(!a){
        puts("No memory.");
        exit(EXIT_FAILURE);
        }
    }
    
void check_file(FILE* file){
    if(!file){
        perror ("file not found");
        exit(EXIT_FAILURE);
        }
    }
void printArray(int *a, size_t sz){
    size_t i=0;
    for(i=0; i<sz;++i){
        printf("%6d", *(a+i));
        }
    puts("");
    }
 
int* createArray(size_t sz){
    int *a=(int*)malloc(sz*sizeof(int));
    check_array(a);
    fillArray(a, sz);
    return a;
    }
    
void fillArray(int *a, size_t sz){
    size_t i=0;
    for(i=0; i<sz;++i){
        a[i]=rand()%100+1; // 0..99
    }
}
    
int* readArray( FILE *file, size_t sz){
    int *arr=(int*)malloc(sz*sizeof(int));
    check_array(arr);
    fread(arr, sizeof(int), sz, file);
    return arr;
}
 
void writeArray(FILE *file, int* a, size_t sz){
    fwrite(a, sizeof(int), sz, file);
    }
 
int max(int *a, size_t sz){
    size_t i=0;
    int max=a[i];
    for (i=1; i<sz; ++i){
        if(max<a[i])
            max=a[i];
    }
    return max;    
}

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

Код представляет собой программу для работы с файлом data.dat, который содержит 10 массивов по 12 целых чисел. В основной функции создается файл data.dat, если он не существует, и открывается для чтения и записи. Затем в цикле создаются 10 массивов, заполняются случайными числами от 1 до 100, записываются в файл, затем считываются обратно, проверяются на корректность заполнения, выводится на экран и освобождается память. Далее в функции modifyFile в цикле сначала считываются все массивы из файла, затем заменяется максимальное значение в каждом массиве на следующее по порядку, после чего обновленные массивы записываются обратно в файл. В конце программы выводится сообщение о успешном выполнении.

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

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