Создать массив файлов и инициализировать их.

jenya7
Дата: 29.01.2018 16:44:18
Пишу в линуксе, но наверно это не столь важно.
Мне нужно програмно создать массив файлов и инициализировать их - присвоить каждому уникалбное имя и заполнить текстом.
FILE *system_files[16] = 
{
				
};

Не соображу как это сделать.
jenya7
Дата: 29.01.2018 18:04:44
а что если так?
typedef struct 
{
	char *name;
	char *text;
}FILE_PARAM;

FILE *system_files[16];

const FILE_PARAM file_params[] = 
{
    { "file1.txt", "line1\r line2\r line3 "  },
    { "file2.txt", ""line4\r line5\r line6 "  } 
    { "file3.txt", ""line7\r line8\r line9 "  } 
};

void SYS_FILES_Init(void)
{
	int i;
	for (i = 0; i< 16; i++)
	{
		system_files[i] = fopen(file_params[i].name, "w+");
		
		fwrite (file_params[i].text , sizeof(char), sizeof(file_params[i].text), system_files[i]);
		
		fclose (system_files[i]);	
	}
}


Вопрос где создадуться файлы? в RAM?
White Owl
Дата: 29.01.2018 18:49:46
jenya7
Вопрос где создадуться файлы? в RAM?

Там куда показывает file_params[i].name.
Если в этой переменной будет абсолютное имя файла ("/home/vasya/myprojects/123/test/someothergarbage/file1.txt") то вот по этому полному пути и попытаются. Если какого-то каталога из упомянутых в пути не существует - файл не создастся, fopen() вернет NULL и твоя программа умрет на попытке записи.
Если в переменной будет относительное имя (любое не абсолютное), то файл будет создаваться относительно текущего каталога. С теми же потенциальными проблемами что и в предыдущем варианте.
Если указанный каталог (неважно абсолютно или относительно) существует, но тебе нельзя туда писать - тоже умрет.
jenya7
Дата: 29.01.2018 18:55:15
White Owl
jenya7
Вопрос где создадуться файлы? в RAM?

Там куда показывает file_params[i].name.
Если в этой переменной будет абсолютное имя файла ("/home/vasya/myprojects/123/test/someothergarbage/file1.txt") то вот по этому полному пути и попытаются. Если какого-то каталога из упомянутых в пути не существует - файл не создастся, fopen() вернет NULL и твоя программа умрет на попытке записи.
Если в переменной будет относительное имя (любое не абсолютное), то файл будет создаваться относительно текущего каталога. С теми же потенциальными проблемами что и в предыдущем варианте.
Если указанный каталог (неважно абсолютно или относительно) существует, но тебе нельзя туда писать - тоже умрет.

я понял. спасибо.
Пётр Седов
Дата: 30.01.2018 00:45:48
jenya7
		fwrite (file_params[i].text , sizeof(char), sizeof(file_params[i].text), system_files[i]);
sizeof(file_params[i].text) = sizeof(char*) = 4 (на типичной 32-битной платформе) или 8 (на типичной 64-битной платформе). Вместо sizeof надо использовать функцию strlen.

jenya7
typedef struct 
{
	char *name;
	char *text;
}FILE_PARAM;
Раз уж поля name и text указывают на строковые литералы, то лучше добавить const:
const char* name;
const char* text;

jenya7
void SYS_FILES_Init(void)
{
	int i;
	for (i = 0; i< 16; i++)
	{
		system_files[i] = fopen(file_params[i].name, "w+");
		
		fwrite (file_params[i].text , sizeof(char), sizeof(file_params[i].text), system_files[i]);
		
		fclose (system_files[i]);	
	}
}
Если так делать, то глобальный массив system_files вообще не нужен, достаточно локальной переменной:
#define LEN(array) (int)(sizeof(array) / sizeof(array[0]))

void SYS_FILES_Init(void)
{
	FILE* f;
	int i;
	for (i = 0; i< LEN(file_params); i++)
	{
		f = fopen(file_params[i].name, "w+");

		fwrite (file_params[i].text , sizeof(char), strlen(file_params[i].text), f);

		fclose (f);
	}
}
jenya7
Дата: 30.01.2018 09:44:37
Пётр Седов,
спасибо