无法在cpp中编辑文件的第二行

时间:2015-11-25 13:32:22

标签: file input output wstring

我想根据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

password-bbb

1 个答案:

答案 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)。 从流中读取只会改变阅读位置而不会改变写作位置,反之亦然。