Я написал функцию readFile для проекта, над которым работаю. Я вызываю его один раз, загружаю в файл и читаю его содержимое - работает нормально Однако, когда я пытаюсь загрузить его во второй раз, пытаюсь изменить ...

0
MCLyonzo 10 Апр 2021 в 03:08

1 ответ

Лучший ответ

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

void menu() { // put in while loop - while True
while(true)
{
    //Keep this as a local variable!
    std::string opt;
    std::string filename;
    cout << "----------------------\n";
    cout << "R(ead) -" << "Read File\n";
    cout << "F(ile) -" << "Set Filename\n";
    cout << "\nPlease select from the above options\n";
    cin >> opt;
    cout << "\nInput entered: " << opt << '\n';
    if (opt == "R") {
        readFile(filename);
    }
    if (opt == "F") {
        filename = getFileName();
    }
}
}

void readFile(const std::string & filename) { 
    ifstream readFile;
    readFile.open(filename);
    if (!readFile.is_open()) {
        cout << "Could not read file " << filename << '\n';
    }
    string str;

    int i = 0;
    while (getline(readFile, str))
    {
        if (str[0] != '/')
        {
            cout << "DEBUG: Line is - " << str << '\n';
        }
    }
    readFile.close();
    //just return to get back to menu
    return;
}

std::string getFileName() {
    cout << "File path: ";
    std::string path;
    getline(cin, path);
    ifstream file(path.c_str());
    if (!file) {
        cout << "Error while opening the file" << '\n';
        //Instead of returning an error code use an exception preferably
    }
    cout << "(File loaded)" << '\n';
    cout << "Path contains: " << path << '\n';
    file.close();
    return path;
}

Другие примечания: В идеале вводите вывод только в одной функции, а не во всех трех, так как это может запутать, за что именно отвечает каждая функция.

Если вы хотите, чтобы что-то содержало файл и распечатало его содержимое, вы можете использовать класс.

Файл проверяется, если его можно открыть дважды, на самом деле нет никаких причин для этого, просто делегируйте эту ответственность одной функции.

Одна из лучших особенностей C ++ - это RAII и детерминированные жизненные циклы для объектов и примитивов - используйте это !! Не давайте всему долгую жизнь с глобальными переменными - вместо этого используйте умные параметры и возвращаемые значения.

0
Lucas Streanga 10 Апр 2021 в 01:05