【问题标题】:fstream doesnt write and make filesfstream 不写入和生成文件
【发布时间】:2020-08-13 16:29:30
【问题描述】:

我的代码有问题。我想使用 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

    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();
        }
    }
} 

【问题讨论】:

  • D:/Doucments 是错字吗?
  • 每次line != name 都会执行else。我认为您想将else 块移出while,因此只有在找不到名称时才会执行。
  • @Yksisarvinen 您可以在 Windows 以及其他操作系统上使用正斜杠 /
  • @JesperJuhl 我认为Doucments 部分是错字的原因。
  • @TedLyngmo 呵呵,你可能是对的。我完全错过了。

标签: c++ fstream


【解决方案1】:

据我所知,代码正在尝试创建新用户。您检查 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";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2012-04-05
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多