Как использовать std::переименование с переменными?

#c #file #rename #file-rename #cstdio

#c #файл #переименовать #файл-переименовать #cstdio

Вопрос:

В моей программе я храню данные в разных текстовых файлах. Данные принадлежат объекту, который я называю ракетами. Например, у ракеты Saturn 5 есть текстовый файл с надписью «Saturn5R.txt». Мне нужна возможность переименовать ракету, и поэтому мне также нужно будет переименовать текстовый файл. Я использую std::переименование в библиотеке. Я заставил его работать с чем-то вроде этого:

 char oldname[] = "Saturn5R.txt"; char newname[] = "Saturn6R.txt";  if (std::rename(oldname, newname) != 0) {  perror("Error renaming file"); }  

Это работает, но я не хочу всегда переименовывать Saturn5R.txt чтобы Saturn6R.txt. Что я хочу сделать, так это иметь возможность переименовать любой текстовый файл на любое имя, я попробовал это сделать и получил сообщение об ошибке:

 char oldname[] = rocketName   RocketNumber   "R.txt"; char newname[] = NameChoice   NumberChoice   "R.txt"; if (std::rename(oldname, newname) != 0) {  perror("Error renaming file");  }  

Это возвращает ошибку «инициализатор массива[cquery] должен быть списком инициализаторов или строковым литералом». Как я могу использовать std::переименование или любую другую функцию переименования файлов, которая позволяет мне переименовывать любые файлы, которые я хочу, без их жесткого кодирования?

Комментарии:

1. используйте std::string и, а затем используйте объединение строк, чтобы объединить части вместе.

Ответ №1:

Это имеет мало общего с std::rename тем , как интерполировать переменные в строку, и все это связано с тем, как интерполировать переменные в строку. Простое решение состоит в том, чтобы использовать std::string . Он имеет перегруженный оператор , который можно использовать для объединения подстрок.

Если вы хотите сделать программу немного более модной, добавлен C 20 std::format :

 std::string oldname = std::format("{}{}R.txt", rocketName, RocketNumber); std::string newname = std::format("{}{}R.txt", NameChoice, NumberChoice); if (std::rename(oldname.c_str(), newname.c_str()) != 0) {  

P.S. Я рекомендую использовать std::filesystem::rename вместо этого, так как, на мой взгляд, у него есть лучшие способы обработки ошибок.