powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Создать массив файлов и инициализировать их.
6 сообщений из 6, страница 1 из 1
Создать массив файлов и инициализировать их.
    #39592868
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу в линуксе, но наверно это не столь важно.
Мне нужно програмно создать массив файлов и инициализировать их - присвоить каждому уникалбное имя и заполнить текстом.
Код: plaintext
1.
2.
3.
4.
FILE *system_files[16] = 
{
				
};


Не соображу как это сделать.
...
Рейтинг: 0 / 0
Создать массив файлов и инициализировать их.
    #39592930
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а что если так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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?
...
Рейтинг: 0 / 0
Создать массив файлов и инициализировать их.
    #39592943
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Вопрос где создадуться файлы? в RAM?
Там куда показывает file_params[i].name.
Если в этой переменной будет абсолютное имя файла ("/home/vasya/myprojects/123/test/someothergarbage/file1.txt") то вот по этому полному пути и попытаются. Если какого-то каталога из упомянутых в пути не существует - файл не создастся, fopen() вернет NULL и твоя программа умрет на попытке записи.
Если в переменной будет относительное имя (любое не абсолютное), то файл будет создаваться относительно текущего каталога. С теми же потенциальными проблемами что и в предыдущем варианте.
Если указанный каталог (неважно абсолютно или относительно) существует, но тебе нельзя туда писать - тоже умрет.
...
Рейтинг: 0 / 0
Создать массив файлов и инициализировать их.
    #39592947
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owljenya7Вопрос где создадуться файлы? в RAM?
Там куда показывает file_params[i].name.
Если в этой переменной будет абсолютное имя файла ("/home/vasya/myprojects/123/test/someothergarbage/file1.txt") то вот по этому полному пути и попытаются. Если какого-то каталога из упомянутых в пути не существует - файл не создастся, fopen() вернет NULL и твоя программа умрет на попытке записи.
Если в переменной будет относительное имя (любое не абсолютное), то файл будет создаваться относительно текущего каталога. С теми же потенциальными проблемами что и в предыдущем варианте.
Если указанный каталог (неважно абсолютно или относительно) существует, но тебе нельзя туда писать - тоже умрет.
я понял. спасибо.
...
Рейтинг: 0 / 0
Создать массив файлов и инициализировать их.
    #39593034
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
Код: plaintext
1.
		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
Код: plaintext
1.
2.
3.
4.
5.
typedef struct 
{
	char *name;
	char *text;
}FILE_PARAM;

Раз уж поля name и text указывают на строковые литералы, то лучше добавить const:
Код: plaintext
1.
2.
const char* name;
const char* text;


jenya7
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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 вообще не нужен, достаточно локальной переменной:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#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);
	}
}
...
Рейтинг: 0 / 0
Создать массив файлов и инициализировать их.
    #39593122
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пётр Седов,
спасибо
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Создать массив файлов и инициализировать их.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]