fstream не пишет и не создает файлы - PullRequest
0 голосов
/ 29 апреля 2020

У меня проблема с моим кодом. Я хочу использовать fstream для создания файлов, а также для записи в файлы, но он создает только один файл и ничего не записывает в него, а два других не создаются. Я надеюсь, что кто-нибудь может мне помочь. Создан файл PlayerMake ofstream, а два других не созданы.

std::string line;

        std::ifstream nameFree;
        nameFree.open(PlayerList);

        if (nameFree.is_open()) {
            while (std::getline(nameFree, line)) {
                if (line == name) {
                    std::cout << "Dieser Name ist leider bereits belegt. Bitte suche dir einen anderen aus." << std::endl;
                    nameFree.close();
                    Neu();
                }
                else {
                    std::string FileCreateCPP = "D:/Doucments/Game/" + name + ".cpp";
                    std::string FileCreateTXT = "D:/Doucments/Game/" + name + ".txt";

                    nameFree.close();

                    std::ofstream PlayerMake;
                    PlayerMake.open(PlayerList, std::ios::app);

                    std::ofstream cpp;
                    cpp.open(FileCreateCPP);

                    std::ofstream txt;
                    txt.open(FileCreateTXT);

                    if (cpp.is_open() && txt.is_open()) {
                        cpp << name;
                        PlayerMake << name << std::endl;
                        PlayerMake.close();
                        cpp.close();
                        txt.close();
                    }
                    else {
                        std::cerr << "Fehler beim erstellen deines Kontos 1" << std::endl;
                        cpp.close();
                        txt.close();
                        Neu();
                    }
                }
            }
        }
        else {
            std::cerr << "Fehler beim erstellen deines Kontos 2" << std::endl;
            Neu();
        }
    }

Я провел некоторое тестирование и немного улучшил свой код и понял, что этот код с помощью std :: cout << " Привет "<< std :: endl; не запускается. </p>

    int Free = 0;
    std::string name;

    std::cout << "Hi. Bitte gebe deinen Namen für den neuen Spielstand ein und bestaetige es mit Enter. Falls du wieder zurück möchtest, gebe 'Exit' ein und bestaetige es ebenfalls mit Enter." << std::endl;
    std::cin >> name;

    if (name == "Exit") {
        main();
    }
    else {
        std::string line;

        std::ifstream nameFree;
        nameFree.open(PlayerList);

        if (nameFree.is_open()) {
            while (std::getline(nameFree, line)) {
                if (line == name) {
                    std::cout << "Dieser Name ist leider bereits belegt. Bitte suche dir einen anderen aus." << std::endl;
                    Free == 0;
                    Neu();
                }
                else {
                    Free == 1;
                }
            }

            nameFree.close();

            if (Free == 1) {
                std::cout << "Hallo" << std::endl;

                std::string FileCreateCPP = "D:/Doucments/Game/Players/" + name + ".cpp";
                std::string FileCreateTXT = "D:/Doucments/Game/" + name + ".txt";

                std::ofstream PlayerMake;
                PlayerMake.open(PlayerList, std::ios::app);

                std::ofstream cpp;
                cpp.open(FileCreateCPP);

                std::ofstream txt;
                txt.open(FileCreateTXT);

                if (cpp.is_open() && txt.is_open()) {
                    cpp << name;
                    PlayerMake << name << std::endl;
                    PlayerMake.close();
                    cpp.close();
                    txt.close();
                }
                else {
                    std::cerr << "Fehler beim erstellen deines Kontos 1" << std::endl;
                    cpp.close();
                    txt.close();
                    Neu();
                }
            }
        }
        else {
            std::cerr << "Fehler beim erstellen deines Kontos 2" << std::endl;
            Neu();
        }
    }
}

Вот код, который вы можете запустить:

#include <iostream>
#include <string>
#include <fstream>

std::string PlayerList = "C:/PlayerList.txt";


void Neu() {
    std::string name;

    std::cout << "Hi. Bitte gebe deinen Namen für den neuen Spielstand ein und bestaetige es mit Enter. Falls du wieder zurück möchtest, gebe 'Exit' ein und bestaetige es ebenfalls mit Enter." << std::endl;
    std::cin >> name;

    if (name == "Exit") {

    }
    else {
        std::string line;

        std::ifstream nameFree;
        nameFree.open(PlayerList);

        if (nameFree.is_open()) {
            while (std::getline(nameFree, line)) {
                if (line == name) {
                    std::cout << "Dieser Name ist leider bereits belegt. Bitte suche dir einen anderen aus." << std::endl;
                    nameFree.close();
                    Neu();
                }
                else {
                    std::string FileCreateCPP = "D:/Doucments/Game/" + name + ".cpp";
                    std::string FileCreateTXT = "D:/Doucments/Game/" + name + ".txt";

                    nameFree.close();

                    std::ofstream PlayerMake;
                    PlayerMake.open(PlayerList, std::ios::app);

                    std::ofstream cpp;
                    cpp.open(FileCreateCPP);

                    std::ofstream txt;
                    txt.open(FileCreateTXT);

                    if (cpp.is_open() && txt.is_open()) {
                        cpp << name;
                        PlayerMake << name << std::endl;
                        PlayerMake.close();
                        cpp.close();
                        txt.close();
                    }
                    else {
                        std::cerr << "Fehler beim erstellen deines Kontos 1" << std::endl;
                        cpp.close();
                        txt.close();
                        Neu();
                    }
                }
            }
        }
        else {
            std::cerr << "Fehler beim erstellen deines Kontos 2" << std::endl;
            Neu();
        }
    }
} 

1 Ответ

0 голосов
/ 29 апреля 2020

Насколько я могу судить, код пытается создать нового пользователя. Вы проверяете PlayerList, чтобы увидеть, существует ли имя - за исключением того, что вы проверяете только имя в списке из-за примечания else.

в моем коде, мне никогда не нужно звонить close(). Деструкторы сделают это.

// Adding a helper function to simplify
bool nameExists(std::string name, std::string path)
{
    std::string line;
    std::ifstream nameFree(path);
    if (nameFree) {
        while (std::getline(nameFree, line)) {
            if (line == name) {
                return true;
            }
        }
    }
    return false;
}

// Returns false if user enters "Exit" or file error
bool Neu(std::string path)
{
    std::string name;

    std::cout << "Hi. Bitte gebe deinen Namen für den neuen Spielstand ein und bestaetige es mit Enter. Falls du wieder zurück möchtest, gebe 'Exit' ein und bestaetige es ebenfalls mit Enter." << std::endl;
    std::cin >> name;

    if (name == "Exit") {
        return false;
    }
    // Check if name already exists...
    if (nameExists(name, path)) {
        // It does. Try again
        std::cout << "Dieser Name ist leider bereits belegt. Bitte suche dir einen anderen aus." << std::endl;
        return Neu(path);
    }
    else {
        // It does not exist. Add it.
        std::string FileCreateCPP = "D:/Doucments/Game/" + name + ".cpp";
        std::string FileCreateTXT = "D:/Doucments/Game/" + name + ".txt";

        // TODO: make sure name does not contain any characters
        // that are not allowed by OS in file names

        std::ofstream PlayerMake(path, std::ios::app);
        std::ofstream cpp(FileCreateCPP);
        std::ofstream txt(FileCreateTXT);

        if (PlayerMake && cpp && txt) {
            cpp << name;
            PlayerMake << name << std::endl;
            return true;
        }
    }
    return false;
}

int main()
{
    while (Neu("C:/PlayerList.txt")) {
        std::cout << "Player created\n";
    }
}
...