【问题标题】:Deleting a specific key from a file using file I/O in C++在 C++ 中使用文件 I/O 从文件中删除特定键
【发布时间】:2021-02-15 05:09:41
【问题描述】:
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 基本上就像一个与每个键相关联的索引

在这种情况下 n = 0,意味着删除第一个键

在这段代码中,我部分成功地删除了我选择的键,但它给出了意外的输出。让我举个例子,给出文件的内容

执行前:

x4pDtc3vI8yHFDar99GUdkPh
0RxLFwFhcyazoZ0zBKmPFR4q
4Haw6HSUQKDhNSxeD0JKMcFT

执行后:

0RxLFwFhcyazoZ0zBKmPFR4q
4Haw6HSUQKDhNSxeD0JKMcFT
4Haw6HSUQKDhNSxeD0JKMcFT

该函数还返回删除的字符串。

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

【问题讨论】:

  • 附带说明,您对while(!f2.eof()) 的使用看起来像wrong,您应该在读取成功之前检查,然后再使用“读取”。
  • _delete_an_apiKey 该名称为全局命名空间中的语言实现保留。如果你定义了这样的函数,程序的行为将是不确定的。您应该为该函数使用另一个名称。
  • @eerorika 我很抱歉函数命名,一旦它开始运行我会更正

标签: c++ string file-handling


【解决方案1】:

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

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

因此,当达到 EOF 时,您会再次使用最后一个结果。

正确的顺序:

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

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

【讨论】:

  • @VaibhavSharma 例如,如果文件不存在,那么您尝试读取,这将失败。然后你输出空字符串,就好像你读取了一个空文件一样。
  • 这是唯一需要检查的条件吗?因为我在进入函数之前已经检查了这个条件
  • @VaibhavSharma 如果文件被删除了怎么办?不,这不是唯一的条件。读取文件失败的原因可能有很多。
  • 好的,明白了,但是我尝试了上面的方法但是失败了
  • 我的意思是你的回答
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2022-12-13
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多