我正在编写一个功能,可以让用户有机会更改他们的用户名。为此,我试图重命名存储其数据的文件。我想出了一个这样做的方法,但是我觉得我很接近。但是我觉得我很接近。
文件名最初是这样创建的 -
std::cout << "Please enter a username: ";
std::getline (std::cin, username);
std::ofstream fout (username + ".txt");
工作正常。然后如果他们以后选择更改用户名
std::cout << "Please type in your new username." << std::endl;
std::getline (std::cin, newUsername);
std::ofstream fout (newUsername + ".txt");
// I copied the contents of username.txt to newUsername.txt here
再次正常工作。
问题在于下面。
问题在于删除原始文件,更具体地说,在添加文件扩展名.txt
时我已将#include包含在remove()功能中 并将.c_str()添加到用户名,因为我相信remover()只会接受C字符串(char *),而不是C ++字符串。
remove(username.c_str() + ".txt"); // error expression must have integral or enum type referring to ".txt".
提前感谢每个人的时间
答案 0 :(得分:4)
足够简单
remove((username + ".txt").c_str());
username + ".txt"
的返回值称为临时(因为它是一个未命名的值),但没有任何内容表示您无法调用方法(如{{1} })在临时对象上。
答案 1 :(得分:0)
remove
以const char*
为参数,您无法使用const char*
运算符将两个+
加在一起。因此,解决方案是将它们添加为字符串,然后在结果上调用c_str()
。
remove((username + std::string(".txt")).c_str());
答案 2 :(得分:0)
你的问题在于:
remove(username.c_str() + ".txt"); // error expression must have integral or enum type referring to ".txt".
添加两个char*
s不会生成string
。
这可能是更好的方法:
auto filename = username + ".txt"
remove(filename.c_str())
答案 3 :(得分:0)
你的问题在于:
remove(username.c_str() + ".txt"); // error expression must have integral or enum type referring to ".txt".
添加两个const char*
s不会产生(std::)string
。
这可能是更好的方法:
auto filename = username + ".txt"
remove(filename.c_str())
请注意,这会生成一个 relative 文件名,而绝对文件名可能会更好,具体取决于调用它的方式。