【问题标题】:C++ Replacing File Text - Not workingC ++替换文件文本 - 不工作
【发布时间】:2014-05-21 01:35:10
【问题描述】:

我正在尝试通过搜索用户名来创建更改密码功能,如果找到确认通过,如果为真则将密码替换为 newPass。

文件是这样写的:USERNAME;PASSWORD

我正在使用它来替换字符串,但不确定它的语法是否正确(我是新的)

tempPass.replace(0, tempPass.length(), newPass); 

这是我当前的代码:

void AccountManager::changePassword(AccountManager & account) {
  string  username, password, newPass, passwordConf, tempUser, tempPass;
  fstream openFile("UserPass.txt", ios_base::out | ios_base::in | ios_base::app);

  // / Check if username exsists.
  do {
    cout << "Enter your username: " << endl;
    getline(cin, username);
    cout << "Enter you current password: " << endl;
    getline(cin, password);

    if (account.UserPass[username] != password) {
      cout << "Username and password do not match. " << endl;
    }
  } while (account.UserPass[username] != password);

  do {
    cout << "Enter new password: " << endl;
    getline(cin, newPass);
    cout << "Retype password: " << endl;
    getline(cin, passwordConf);

    if (newPass != passwordConf) {
      cout << "Password does not match confirmation. " << endl;
    }
  } while (newPass != passwordConf);

  // /find / replace password with newPass in file
  while (!openFile.eof()) {
    getline(openFile, tempUser, ';');
    getline(openFile, tempPass);

    if ((tempUser == username) && (tempPass == password)) {
      ofstream openFile("UserPass.txt", ios_base::app);

      tempPass.replace(0, tempPass.length(), newPass);    // changes pass in file at index ;+1
      cout << "Password has been changed. " << endl;
      switchLog(account);                                 // Login on successful password change.

      break;
    }
  }
  account.UserPass[username] = newPass;
}

谢谢,

【问题讨论】:

    标签: c++ fstream


    【解决方案1】:

    您可以通过寻找文件的位置,然后用完全相同相同数量的字节替换数据来解决问题,但是除非文件非常大并且发生替换,否则不鼓励这样做对于非常少量的数据。

    编辑文件内容的正确方法是:

    1. 读取文件的全部内容
    2. 对内存中读取的数据进行修改
    3. 将此修改后的数据写入新文件
    4. 删除旧文件

    阅读Why is it not possible to erase contents from a file in C++?了解更多详情。

    【讨论】:

    • 可以使用 ostream 写入文件的任何位置。想想seekp
    • 您能否指导我按照我的情况进行追加编辑,只是为了学习?至于制作新文件并复制所有内容,我将如何在不破坏整个程序的情况下做到这一点(交换名称?)
    • 请查看编辑后的答案,如果您觉得有帮助,请将其标记为正确。
    • 我需要在我的情况下的语法,而不是它是否可以完成。不过,我非常感谢你的帮助,ty。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多