Другие языки программирования и технологии

Управление файлами нижнего уровня

Доброй ночи, помогите пожалуйста с задачей
Напишите программу на C, которая генерирует простую матрицу случайных чисел с плавающей точкой и сохраняет ее в файл. Имя файла должно предоставляться командной строкой Linux, и программа должна работать, только если файл уже существует.
Подсказка: Чтобы понять содержание этого задания, вы должны сохранить матрицу в одной инструкции «wirte».
Igor Malyshko
Igor Malyshko
94
спасибо за подсказку.
Алексей Коломиец
Алексей Коломиец
20 482
Лучший ответ
//C99 required
#include < stdio.h >
#include < stdlib.h >
#include < stdbool.h >
#include < string.h >
#include < time.h >

const char pathSeparator =
#ifdef __linux__
'/';
#elif __WIN32
'\\';
#else
'\0';
#error Platform is not supported. Please set the path delimiter
#endif

const char* error = "error";
const char* usingFormat = "using: %s filename\n";
const char* printFormat = "%8.2f";
const size_t m = 2, n = 5;
const size_t mSize = m*n;
const float loLimit = -10, hiLimit = 10;

int main(int argc, char* argv[]) {

//params override - just for test
//argc=2;
//argv[1] = "/home/user/test.txt";

if (argc!=2) {
fprintf(stderr, usingFormat, strrchr(argv[0], pathSeparator)+1);
return EXIT_FAILURE;
}

FILE *f = fopen(argv[1], "r+b");

if (!f) {
perror(error);
return EXIT_FAILURE;
}

float* matrix = (float*)malloc(sizeof(float)*mSize);
if (!matrix) {
perror(error);
fclose(f);
return EXIT_FAILURE;
}

srand(time(NULL));
float *p = matrix;
for(size_t i=0;i<m;i++) {
for(size_t j=0;j<n;j++, p++) {
*p = loLimit + ((float)rand())/((float)RAND_MAX/(hiLimit-loLimit));
printf(printFormat, *p);
}
puts("");
}

bool isOk = fwrite(matrix, sizeof(float), mSize, f)==mSize;
if (!isOk) perror(error);

free(matrix);
fclose(f);

return isOk? EXIT_SUCCESS : EXIT_FAILURE;
}

P.S: В задании не сказано что делать если существующий файл больше чем размер записываемых данных. Соотв. в этом случае тут будет перезаписано m*n*sizeof(float) байт, остальное содержимое файла будет не тронуто.
Файл есс-но будет двоичный (условие намекает), так что блокнотом его открывать бесполезно =)
Слава Гаврин
Слава Гаврин
84 764