我想根据userinput编辑用户名和密码。我有一个文件exampless.txt whixh有默认的用户名和密码值。我想根据用户输入替换用户名和密码的值。我可以替换用户名值。但密码值不会改变。
我的代码如下:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
int main()
{
std::wstring y;
std::wstring username;
std::wstring password;
std::cout<<"enter the username:";
std::wcin>>username;
std::cout<<"enter the password:";
std::wcin>>password;
std::wstring x=L"username";
std::wstring a=L"password";
std::wfstream fp("/home/aricent/Documents/exampless.txt",std::ios::in | std::ios::out );
while(!fp.eof()) {
std::getline(fp, y);
if (y.find(x, 0) != std::string::npos) {
std::wstring z=y.substr(y.find(L"-") + 1) ;
fp.seekg( 0, std::ios::beg );
fp<<y.replace(x.length()+1, z.length(), username)<<"\n";
fp.clear();
fp.seekg( 0, std::ios::beg );
}
fp.seekg(0,std::ios::beg);
std::getline(fp, y);
if (y.find(a, 0) != std::string::npos) {
std::wstring b=y.substr(y.find(L"-") + 1) ;
fp<<y.replace(a.length()+1, b.length(), password <<std::endl;
fp.clear();
}
}
fp.close();
}
我的exampless.txt文件包含:
username-aaa
答案 0 :(得分:0)
您的代码无法正常工作的原因有很多。有些与您打算这样做的方式有关。有些与您实际实施想法的方式有关。
所以我建议你用以下方式简化代码。
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
int main() {
std::wstring username;
std::wstring password;
std::cout<<"enter the username:";
std::wcin>>username;
std::cout<<"enter the password:";
std::wcin>>password;
std::wfstream fp("/home/aricent/Documents/exampless.txt",std::ios::in | std::ios::out );
if(!fp) { /* Failed to open file. do something */ }
<here you can check whether the file is already properly formatted>
if(!(fp << "username-" << username << "\npassword-" << password << "\n") {
//writing failed. Do something to handle this error (like throwing an exception)
}
fp.close();
}
因此,不是读取文件内容,修改文件并将其写回文件,您只需用您想要包含的内容覆盖它即可。 这避免了(并在这种情况下修复)了很多问题。 此外,您的代码应检查任何异常状态并正确处理它们(如无法打开文件)。
在您的代码中,您还要在写入之前检查文件是否格式正确(例如,用户名和密码行是否已存在)。上述更改使此步骤变得多余,但如果您仍希望执行此检查,则可将其置于两者之间。
最后,我想澄清一个误解。 std::fstream
在文件流中保留两个不同的位置。一个用于阅读,一个用于写作。要更改这些位置,它有两种方法seekp(pos)
和seekg(pos)
。 seekp(pos)
更改文件流中的任何位置,任何写操作(如operator&lt;&lt;和put())开始编写(p
代表put
我猜)。 seekg(pos)
更改文件流中的任何位置,任何读取操作(如operator&gt;&gt;和get())都会开始写入(g
代表get
)。
从流中读取只会改变阅读位置而不会改变写作位置,反之亦然。