Помогите оптимизировать

Существуют ли функции, чтобы функция string Create_Name(string Old_Name); для создания имен исходя из существующего имени была поменьше, а то громадина и мне кажется это как то сложно для чтения. Подскажите пожалуйста кто знает.

#include <iostream>
#include <fstream>

using namespace std;

string Create_Name(string Old_Name);
string Log(bool a);

int main(){
    setlocale(0,"");

    bool Func = 0;                                          // 0 чтение // 1 новый
    cout << "Enter 0 for read, or 1 for create new file: ";
    cin >> Func;
    cout << Log(Func) << endl;                              //  должна вернуть имя актуального файла для записи

    return 0;
}



string Log(bool a){
    string Name_Enter;
    char data[12];

    ifstream file ("config.log.txt");                       // считать из указанного файла
    if (!file.is_open()){                                   // если файла нет
        ofstream file ("config.log.txt", ios_base::app);    // создать его переместить курсор в конец файла
        file << Create_Name(Name_Enter);                    // взять строку и отправить в функцию после чего записать имя в файл
        Name_Enter = Create_Name(Name_Enter);               // присвоить строке значение функции
        file.close();
        cout << "test, First create" << endl;
    }

    else if(a == 0 && file.is_open()){                      // если переменная равна 0 и файл существует
        file.getline(data, 12);                             // cчитать из указанного файла в массив чаров
        for (int i = 0; i < 12; i++)                        // перевести из полученных чаров в строку
            Name_Enter += data[i];
        file.close();
        cout << "test, Don't change(0)" << endl;
    }

    else if(a == 1 && file.is_open()){                      // если переменная равна 1 и файл существует
        file.getline(data,12);                              // cчитать из указанного файла в массив чаров
        for (int i = 0; i < 12; i++)                        // перевести из полученных чаров в строку
            Name_Enter += data[i];
        ofstream file ("config.log.txt", ios_base::out | ios_base::trunc);    // открыть файл для записи и стереть его
        file << Create_Name(Name_Enter);                    // записать значение функции в которую было отправлено старое имя
        Name_Enter = Create_Name(Name_Enter);               // присвоить строке новое полученное имя
        file.close();
        cout << "test, Change (+1)" << endl;
    }

    return Name_Enter;
}


string Create_Name(string Old_Name){                        // функция создания имени
    string Name_Log_File = "log.001.txt";                   // первое имя при первом обращении

    if (Old_Name.length() == 0)                             // если строка пустая то ничего не делать
        cout << "test, First name" << endl;

    else{                                                   // в противном случае
        if(Old_Name[6] == '0') {                            // считать занчение из старого имени если оно 0
            Name_Log_File[6] = '1';                         // к еденицам на 1 больше
            Name_Log_File[5] = Old_Name[5];                 // десятки оставить пержние
            Name_Log_File[4] = Old_Name[4]; }               // сотни оставить пержние
        if(Old_Name[6] == '1') {
            Name_Log_File[6] = '2';
            Name_Log_File[5] = Old_Name[5];
            Name_Log_File[4] = Old_Name[4]; }
        if(Old_Name[6] == '2') {
            Name_Log_File[6] = '3';
            Name_Log_File[5] = Old_Name[5];
            Name_Log_File[4] = Old_Name[4]; }
        if(Old_Name[6] == '3') {
            Name_Log_File[6] = '4';
            Name_Log_File[5] = Old_Name[5];
            Name_Log_File[4] = Old_Name[4]; }
        if(Old_Name[6] == '4') {
            Name_Log_File[6] = '5';
            Name_Log_File[5] = Old_Name[5];
            Name_Log_File[4] = Old_Name[4]; }
        if(Old_Name[6] == '5') {
            Name_Log_File[6] = '6';
            Name_Log_File[5] = Old_Name[5];
            Name_Log_File[4] = Old_Name[4]; }
        if(Old_Name[6] == '6') {
            Name_Log_File[6] = '7';
            Name_Log_File[5] = Old_Name[5];
            Name_Log_File[4] = Old_Name[4]; }
        if(Old_Name[6] == '7') {
            Name_Log_File[6] = '8';
            Name_Log_File[5] = Old_Name[5];
            Name_Log_File[4] = Old_Name[4]; }
        if(Old_Name[6] == '8') {
            Name_Log_File[6] = '9';
            Name_Log_File[5] = Old_Name[5];
            Name_Log_File[4] = Old_Name[4]; }
        if(Old_Name[6] == '9') {                            // если старое значение едениц 9
            Name_Log_File[6] = '0';                         // то сделать 0
            if(Old_Name[5] == '0') {                        // если у десятков 0
                Name_Log_File[5] = '1';                     // то сделать 1
                Name_Log_File[4] = Old_Name[4]; }           // сотни оставить прежние как в старом файле
            if(Old_Name[5] == '1') {
                Name_Log_File[5] = '2';
                Name_Log_File[4] = Old_Name[4]; }
            if(Old_Name[5] == '2') {
                Name_Log_File[5] = '3';
                Name_Log_File[4] = Old_Name[4]; }
            if(Old_Name[5] == '3') {
                Name_Log_File[5] = '4';
                Name_Log_File[4] = Old_Name[4]; }
            if(Old_Name[5] == '4') {
                Name_Log_File[5] = '5';
                Name_Log_File[4] = Old_Name[4]; }
            if(Old_Name[5] == '5') {
                Name_Log_File[5] = '6';
                Name_Log_File[4] = Old_Name[4]; }
            if(Old_Name[5] == '6') {
                Name_Log_File[5] = '7';
                Name_Log_File[4] = Old_Name[4]; }
            if(Old_Name[5] == '7') {
                Name_Log_File[5] = '8';
                Name_Log_File[4] = Old_Name[4]; }
            if(Old_Name[5] == '8') {
                Name_Log_File[5] = '9';
                Name_Log_File[4] = Old_Name[4]; }
            if(Old_Name[5] == '9') {                        // если у десяток 9
                Name_Log_File[5] = '0';                     // сделать 0
                if(Old_Name[4] == '0')                      // если у сотен 0
                    Name_Log_File[4] = '1';                 // сделать 1
                if(Old_Name[4] == '1')
                    Name_Log_File[4] = '2';
                if(Old_Name[4] == '2')
                    Name_Log_File[4] = '3';
                if(Old_Name[4] == '3')
                    Name_Log_File[4] = '4';
                if(Old_Name[4] == '4')
                    Name_Log_File[4] = '5';
                if(Old_Name[4] == '5')
                    Name_Log_File[4] = '6';
                if(Old_Name[4] == '6')
                    Name_Log_File[4] = '7';
                if(Old_Name[4] == '7')
                    Name_Log_File[4] = '8';
                if(Old_Name[4] == '8') {
                    Name_Log_File[4] = '9';                 // если у сотен стало 9
                    cout << "Error!!! Need new place for names!!!!!(last 99/999)" << endl; }     // дать пердупреждение
                if(Old_Name[4] == '9') {                    // если у сотен 9 у десяток 9 и едениц 9 то изменить значение на 000
                    Name_Log_File[4] = '0';                 // что приведет к перетиранию файлов
                    cout << "it's last name. Start name 000.  Error!" << endl; }
            }
        }
    }
    return Name_Log_File;
}

macsim, а если бы там было 6-ти, 8-ми или 12-ти значное число?

Я не очень понимаю из каких соображений что у тебя сделано, поэтому особо не резвился, но достаточно очевидные ляпы поправил:

int main() {
    setlocale(0, "");

    int ans;
    cout << "Enter 0 for read, or 1 for create new file: ";
    cin >> ans;
    cout << Log(ans != 0) << endl;      //  должна вернуть имя актуального файла для записи
    return 0;
}

const size_t LogFileNamelength = 12;

string Log(bool changeLogFileName) {
    string Name_Enter;
    char data[LogFileNamelength];

    ifstream file("config.log.txt");                        // открыть файл
    if (!file.is_open()) {                                  // если файла нет
        ofstream ofile("config.log.txt", ios_base::app);    // создать его переместить курсор в конец файла
        Name_Enter = Create_Name(Name_Enter);               // присвоить строке значение функции
        ofile << Name_Enter;                                // взять строку и записать имя в файл
        ofile.close();
        cout << "test, First create" << endl;
    }
    else {
        if (!changeLogFileName) {
            file.getline(data, LogFileNamelength);    // cчитать из указанного файла в массив чаров
            Name_Enter = data;                        // перевести из полученных чаров в строку
            file.close();
            cout << "test, Don't change(0)" << endl;
        }
        else {
            file.getline(data, LogFileNamelength);    // cчитать из указанного файла в массив чаров
            Name_Enter = data;                        // перевести из полученных чаров в строку
            file.close();                             // закрыть файл
            ofstream ofile("config.log.txt", ios_base::out | ios_base::trunc);    // открыть файл для записи и стереть его
            Name_Enter = Create_Name(Name_Enter);     // присвоить строке новое полученное имя
            ofile << Name_Enter;                      // записать новое имя
            ofile.close();
            cout << "test, Change (+1)" << endl;
        }
    }

    return Name_Enter;
}

string Create_Name(const string & Old_Name) {
    string Name_Log_File = "log.001.txt";

    if (Old_Name.length() == 0) {
        cout << "test, First name" << endl;
        return Name_Log_File;
    }

    int n = stoi(Old_Name.substr(4, 3));
    ++n;

    if (n >= 1000) {
        cout << "warning: bla-bla-bla\n";
        n = 1;
    }
    stringstream ss;
    ss << "log." << setw(3) << setfill('0') << n << ".txt";
    return ss.str();
}

А можно сделать в C-style. Но сигнатура функции поменяется.

#include <cstring>
// ...
bool Create_Name0(char *buf) {
    bool ret = true;
    int n = atoi(buf + 4);
    ++n;
    if (n >= 1000) {
        n = 1;
        ret = false;
    }
    char tmp[4];
    sprintf_s(tmp, 4, "%03d", n);
    memcpy_s(buf + 4, 3, tmp, 3);
    return ret;
}

Тут изменение имени происходит прямо в буфере, так сказать, «по месту». И сообщений функция никаких не дает — вместо этого возвращает состояние ошибки.

sam,
т.е. такик куском я могу не ограничиваться колличеством имен создаваемых файлов. Спасибо большое за помощь, я еще щас разберу пример с С, может он мне больше понравится.

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>

using namespace std;

int main(){

    string Name = "log.001.txt";

    int n = stoi(Name.substr(4));
    ++n;

    stringstream ss;
    ss << "log." << setw(3) << setfill('0') << n << ".txt";

    cout << ss.str() << endl;

    return 0;
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.