在 C++ 中使用文件 I/O 从文件中删除特定键

Deleting a specific key from a file using file I/O in C++

string _delete_an_apiKey(int n) 
{
    string a;
    string del;
    int cnt = 0;
    ofstream f1("tempAPIKeys.dat",ios::app);    // Temporary file for executing deletion
    ifstream f2(file,ios::in);                  // Main file containing all the keys
    while(!f2.eof()) 
    {
        if(cnt != n) 
        {
            f2 >> a;
            f1 << a << endl;
        }
        else
        {
            f2 >> del;
        }
        ++cnt;
    }
    f1.close();
    f2.close();
    remove(fileName);
    rename("tempAPIKeys.dat",fileName);
    return del;
}

n is basically like an index which is associated with each key

in this case n = 0, meaning delete the first key

在此代码中,我已部分成功地删除了我选择的密钥,但它给出了意外的输出。让我给你一个例子,给出文件的内容:

执行前:

x4pDtc3vI8yHFDar99GUdkPh
0RxLFwFhcyazoZ0zBKmPFR4q
4Haw6HSUQKDhNSxeD0JKMcFT

执行后:

0RxLFwFhcyazoZ0zBKmPFR4q
4Haw6HSUQKDhNSxeD0JKMcFT
4Haw6HSUQKDhNSxeD0JKMcFT

该函数还returns删除的字符串。

现在你可以很容易地看出我删除了第一个密钥,但我不知道为什么最后一个密钥存储了两次。

你的操作顺序有误。你做什么:

  • 检查读取是否为 EOF
  • 从文件读取
  • 使用结果

因此,当到达 EOF 时,您将再次使用最后的结果。

正确顺序:

  • 从文件读取
  • 检查读取是否为 EOF
  • 仅当结果不是 EOF 时才使用结果

此外,您不检查由于其他原因导致读取失败的情况。

你看到 last key 两次的原因是因为 iostream::eof 在读取流末尾后引发,这并不意味着下一次读取将是文件末尾。

在while循环中使用inputStream >> data,保证读取成功进入循环,如:

while(f2 >> a) 
{
  if(cnt != n) 
  {
    f1 << a << endl;
  }
  else
  {
    del = a;
  }
  ++cnt;
}