Каким образом можно сохранять временные данные в программе на языке программирования C?

Какие переменные лучше использовать для хранения временных данных, таких как строки, имена файлов и т.д.? Например, как можно сохранить имена файлов из списка для последующего использования при открытии файлов в цикле? Как обойти ограничения, связанные с неизвестной длиной данных при использовании указателей?
  • 29 июня 2024 г. 10:42
Ответы на вопрос 5
Для сохранения временных данных в программе на языке С можно использовать различные способы, в зависимости от типа данных и их объема. 

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);
}
Похожие вопросы