【发布时间】: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 呵呵,你可能是对的。我完全错过了。