#c
#c
Вопрос:
Я пытаюсь создать подкаталог с сегодняшней датой в папке. Код успешно компилируется, но выдает ошибку во время выполнения.
#include <iostream>
#include <chrono>
#include <sstream>
#include <iomanip>
#include <bits/stdc .h>
#include <sys/stat.h>
#include <sys/types.h>
using namespace std;
int main()
{
// First create the directory with username
if (mkdir("Anita_", 0777) == -1)
cerr << "Error : " << strerror(errno) << endl;
else
cout << "Directory created";
//Pull out system date
auto const now = std::chrono::system_clock::now();
auto const in_time_t = std::chrono::system_clock::to_time_t(now);
std::stringstream ss;
ss << std::put_time(std::localtime(amp;in_time_t), "%d_%m_%Y");
//Prepare for subdirectory creating
std::cout << ss.str() << std::endl;
string str_="mkdir -p Anita_/ss.str()";
const char *com=str_.c_str();
system(com);
//system("mkdir -p Anita_/ss.str().c_str()");
}
Во время выполнения я получаю эту ошибку:
sh: 1: Синтаксическая ошибка: «(» неожиданно
Можно ли использовать mkdir()
вместо system()
, например mkdir('Anita_/ss.str().c_str()', 0700);
Комментарии:
1. Я полагаю, вы не пытаетесь создать файл с именем
Anita_/ss.str()
? Это то, что в вашей строке? std::filesystem::create_directories было бы намного проще2. @AlanBirtles ss содержит сегодняшнюю дату. Но я не могу объединить ss, которая является переменной, с ‘Anita_’, которая является постоянной (извините, но я родом из python).
Ответ №1:
Вы не можете заключать ss.str()
в двойные кавычки и ожидать, что оболочка выполнит код C .
Вместо этого вы должны выполнить оценку ss.str()
в своей программе и передать результаты в оболочку
string str_ = "mkdir -p Anita_/" ss.str();
const char *com = str_.c_str();
system(com);
Эта версия использует
для добавления "mkdir -p Anita_/"
и результата ss.str()
в вашей программе перед передачей этой команды в оболочку.
Кстати, там есть две переменные, которые вам не нужны, эта одна строка кода делает то же самое
system(("mkdir -p Anita_/" ss.str()).c_str());
или, если это кажется немного сложным, вы могли бы сделать это
string str_ = "mkdir -p Anita_/" ss.str();
system(str_.c_str());
которая, по крайней мере, избавляет от одной переменной.
Вам не нужно использовать переменную каждый раз, когда вы вызываете функцию, вы можете вызвать функцию с выражением.
Комментарии:
1. Отлично !! Я многому учусь, огромное спасибо!!
2. что, если я хочу создать подкаталог —> mkdir -p var1/ss.str( ); //Где var1 — переменная. Я пробовал это, но это создает var1/15_01_2021 вместо anita/15_01_2021
3. @AnitaShukla Вам просто нужно сделать то же самое, что и раньше,
var1
только означает что-то в вашем коде, это не означает ничего особенного внутри строки. Попробуйте этоstring str_ = "mkdir -p " var1 "/" ss.str();
(я предполагаюvar1
, что это строковая переменная).4. @AnitaShukla Хорошо, как я уже сказал, поскольку предполагалось, что ваша переменная была строковой переменной, но из сообщения об ошибке я вижу, что это массив символов. Простое исправление, преобразуйте массив
var1
символов в строку, подобную этойstring str_ = "mkdir -p " string(var1) "/" ss.str();
5. @AnitaShukla Но на самом деле, как программист на C , вы должны избавиться от привычки использовать массивы символов, они почти никогда не нужны, вы должны предпочесть строковые переменные.