Denisov80
@Denisov80
Юный Программист

Как хранить временные данные в программе на Си?

Подскажите в каких переменных можно хранить временные данные, такие как
строки, имена файлов (заранее неизвестной длины) и т.д.

Такой метод вроде не корректно, так как неизвестна длина данных:
char * filename = "data.txt";

Пустой указатель тоже не работает, надо присваивать адрес переменных:
char * filename;

Просто как пример:

Прочитал файл содержащий список файлов,
и как в цикле например открыть и прочитать каждый файл из списка (по требованию),
я имею ввиду куда сохранять имена файлов из списка, это как раз временные данные, которые нужны только для открытия и чтения файла.
  • Вопрос задан
  • 115 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dima20155
you don't choose c++. It chooses you
В языке С вы несете отвественность за размеры массивов и обязуетесь не выходить за их предеты, в противном случае ОС накажет вас за это.
Есть небольшое отличие строк от других типов массивов
В С зачастую работают с null-terminated строками (https://en.wikipedia.org/wiki/Null-terminated_string).
Запись следующего вида:
char * filename = "data.txt";
Присваивает переменной типа указатель на константную строку, сохраненную в самом бинарном файле (вы можете открыть exe файл и найти там эту самую строку).
Строка представляет собой 9 символов (data.txt + \0), последний символ как раз и является нуль-терминатором.

В общем же случае, вы самостоятельно должны хранить в отдельной переменной размер массива

вот пример:
https://godbolt.org/z/MW4Kxh5s8
Ответ написан
Комментировать
AshBlade
@AshBlade
Просто хочу быть счастливым
Отвечаю на просто как пример:
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);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы