Создание вложенной папки в каталоге на c приводит к синтаксической ошибке

#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 , вы должны избавиться от привычки использовать массивы символов, они почти никогда не нужны, вы должны предпочесть строковые переменные.