C/C++

Написать фрагмент кода на си

5. Функция создает двоичный файл с именем «a.dat», пишет туда содержимое массива в в формате «количество элементов - элементы», закрывает файл (4 балла)
 void save_in_file(void* arr, unsigned long long arr_size, const char* path) 
{
FILE* file;
fopen(path, "wb");
if (!file)
{
printf("Can't create file: %s\n", path);
return;
}
if (fwrite(&arr_size, 8, 1, file) != 8|| fwrite(arr, 1, arr_size, file) != arr_size)
{
printf("Write error file: %s\n", path);
}
fclose(file);
}
(массив arr, размер arr_size, путь к файлу path)
arr - передаем какой нибудь массив
arr_size - полный размер (я хз в каких еденицах подается массив, поэтому размер в байтах)
path - путь к файлу.
Есть зависимость от размера unsigned long long. Однако чтобы ее не было, формат записи нужно менять на "размер размера (один байт), размер массива в байтах, сам массив".

Массив формирует считывающая функция, которая, по забинденному типу сама расчитает количество элементов (size_arr/size_element) и сформирует массив.
Сергей Фронк
Сергей Фронк
51 416
Лучший ответ
 #define __USE_MINGW_ANSI_STDIO 1 
#include
#include
#include

void CreateFileWithData(const char *filename, void *data, size_t count, size_t size);
void *TestFileWithData(const char *filename, size_t size, size_t *count);


int main(int argc, char ** argv) {
double a[] = {1.1, 2.2, 3.3, 5.0, 7.7};
// Пишем в файл
CreateFileWithData("test.dat", a, sizeof a / sizeof *a, sizeof *a);

// Тестируем
size_t count = 0;
void *data = TestFileWithData("test.dat", sizeof(double), &count);
assert(data);

for (size_t i = 0; i < count; i++)
printf("%g\n", *(double *)(data + i *sizeof(double)));

return 0;
}

/*
CreateFileWithData
filename - имя файла для записи
data - что пишем
count - количество записываемых объектов
size - размер каждого записываемого объекта
*/
void CreateFileWithData(const char *filename, void *data, size_t count, size_t size) {
FILE *fp = fopen(filename, "wb");
if (!fp) {
perror("error");
return;
}
if (fwrite(&count, sizeof(size_t), 1, fp) != 1 || fwrite(data, size, count, fp) != count) {
printf("error to write file %s\n", filename);
fclose(fp);
return;
}
fclose(fp);
}


/* TestFileWithData возвращает указатель на данные размером size и количеством count */
void *TestFileWithData(const char *filename, size_t size, size_t *count) {
FILE *fp = fopen(filename, "rb");
if (!fp) {
perror("error");
return NULL;
}
if (fread(count, sizeof count, 1, fp) != 1) {
printf("error reading count: %zu\n", *count);
fclose(fp);
return NULL;
}
void *data = malloc(size * *count);
if (fread(data, size, *count, fp) != *count) {
printf("error readind data from %s\n", filename);
fclose(fp);
return NULL;
}
fclose(fp);
return data;
}
Вахид .
Вахид .
11 084
#include<stdio.h>
#define count 5
int main()
{

FILE *f=fopen("a.dat", "wb");
if(!f) exit(1);
int arr[count] = {5, 1, 3, 4, 7};
printf(f, "%d - ", count);
for(int i = 0; i < count; i++)
printf(f, " %d", arr[i]);
fclose(f);

return 0;
}
 void CreateBinaryFile(int[] array) 
{
// Создаем новый бинарный файл с именем "a.dat"
using (BinaryWriter writer = new BinaryWriter(File.Open("a.dat", FileMode.Create)))
{
// Записываем количество элементов массива в файл
writer.Write(array.Length);

// Перебираем элементы массива и записываем их в файл
foreach (int item in array)
{
writer.Write(item);
}
}
}