Какие переменные лучше использовать для хранения временных данных, таких как строки, имена файлов и т.д.? Например, как можно сохранить имена файлов из списка для последующего использования при открытии файлов в цикле? Как обойти ограничения, связанные с неизвестной длиной данных при использовании указателей?
Для сохранения временных данных в программе на языке С можно использовать различные способы, в зависимости от типа данных и их объема. 1. Для хранения строк можно использовать массивы символов (char arrays), указатели на char, или динамическое выделение памяти (malloc/calloc). Например, для сохранения имен файлов из списка для последующего использования можно создать массив строк (array of strings) или массив указателей на строки. Пример: ```c char filenames[10][50]; // массив из 10 строк длиной 50 символов каждая ``` 2. Для хранения имен файлов в списке можно использовать также динамическое выделение памяти для массива указателей на строки: ```c char** filenames; // массив указателей на строки filenames = malloc(10 * sizeof(char*)); // выделение памяти для 10 указателей for (int i = 0; i < 10; i++) { filenames[i] = malloc(50 * sizeof(char)); // выделение памяти для каждой строки } ``` 3. Для обхода ограничений, связанных с неизвестной длиной данных при использовании указателей, можно использовать динамическое выделение памяти и управление этой памятью вручную. При этом важно не забывать освобождать выделенную память с помощью функции `free()` после окончания работы с данными. Пример освобождения памяти для массива указателей на строки: ```c for (int i = 0; i < 10; i++) { free(filenames[i]); // освобождение памяти для каждой строки } free(filenames); // освобождение памяти для массива указателей ``` В целом, для временных данных важно выбирать такие переменные, которые позволяют правильно управлять памятью и обходить ограничения по длине данных. Кроме того, важно следить за правильным освобождением памяти после окончания работы с временными данными, чтобы избежать утечек памяти.
В языке С вы несете отвественность за размеры массивов и обязуетесь не выходить за их предеты, в противном случае ОС накажет вас за это.
Есть небольшое отличие строк от других типов массивов
В С зачастую работают с null-terminated строками ( https://en.wikipedia.org/wiki/Null-terminated_string ).
Запись следующего вида:
char * filename = "data.txt";
Присваивает переменной типа указатель на константную строку, сохраненную в самом бинарном файле (вы можете открыть exe файл и найти там эту самую строку).
Строка представляет собой 9 символов (data.txt + \0), последний символ как раз и является нуль-терминатором.
В общем же случае, вы самостоятельно должны хранить в отдельной переменной размер массива
вот пример:
https://godbolt.org/z/MW4Kxh5s8
Отвечаю на просто как пример :
1. Создаешь переменную типаchar*
для хранения названия файла
2. Открываешь файл через stdio (важно):FILE* f = fopen("file.txt", "r");
3. В цикле вызываешьgetline
для чтения строк из файла
4. После прочтения очередной строки открываешь этот файл и выполняешь свою логику (это внутри этой итерации)
5. В конце, освобождаешь память из переменной названия файла
Как-то так
char *filename = NULL; FILE *file = NULL; ssize_t read = 0; size_t len = 0; while ((read = getline(&filename, &len, file) > 0) { // Делаешь что-то с файлом // Его название в переменной filename хранится } fclose(file); if (filename) { free(filename); }
В языке С вы несете отвественность за размеры массивов и обязуетесь не выходить за их предеты, в противном случае ОС накажет вас за это.
Есть небольшое отличие строк от других типов массивов
В С зачастую работают с null-terminated строками ( https://en.wikipedia.org/wiki/Null-terminated_string ).
Запись следующего вида:
char * filename = "data.txt";
Присваивает переменной типа указатель на константную строку, сохраненную в самом бинарном файле (вы можете открыть exe файл и найти там эту самую строку).
Строка представляет собой 9 символов (data.txt + \0), последний символ как раз и является нуль-терминатором.
В общем же случае, вы самостоятельно должны хранить в отдельной переменной размер массива
вот пример:
https://godbolt.org/z/MW4Kxh5s8
Отвечаю на просто как пример :
1. Создаешь переменную типаchar*
для хранения названия файла
2. Открываешь файл через stdio (важно):FILE* f = fopen("file.txt", "r");
3. В цикле вызываешьgetline
для чтения строк из файла
4. После прочтения очередной строки открываешь этот файл и выполняешь свою логику (это внутри этой итерации)
5. В конце, освобождаешь память из переменной названия файла
Как-то так
char *filename = NULL; FILE *file = NULL; ssize_t read = 0; size_t len = 0; while ((read = getline(&filename, &len, file) > 0) { // Делаешь что-то с файлом // Его название в переменной filename хранится } fclose(file); if (filename) { free(filename); }