【问题标题】:How to delete a record from a text file?如何从文本文件中删除记录?
【发布时间】:2022-01-02 17:18:25
【问题描述】:

如何从文本文件中删除一条记录(在数组结构中)?我的代码有效,但它也删除了其他记录。我可以知道我的代码有什么问题吗?这是它的样子:

{           
    zfp = fopen("note.txt", "wb+");
    if (fp == NULL)
    {
          printf("| File can not be opened.\n");
          exit(1);
    }
    for(int k = 0; k < len; k++)
    {
        if(k == s)
        {
            strcpy(notes[s].title, "\0");
            notes[s].day = 0;
            notes[s].month = 0;
            notes[s].year = 0;
        }
    }
    fwrite(&note, sizeof(note), 1, fp);
    fclose(fp);
}

顺便说一句,在这部分之前,我有一个代码询问您要删除的事件编号。数组索引从 0 开始,事件编号从 1 开始。因此与该事件编号关联的数据/记录将是 s = eventnumber - 1 以匹配数组的索引。

【问题讨论】:

  • fwritestruct 与“文本文件”一起使用不是可行的方法。
  • 读取文件。修改内存中的数据。将数据写入新文件。删除旧文件。将新文件重命名为旧文件名。使用文件的完整路径以确保它会影响您想要的文件。
  • 您正在编写二进制文件,而不是文本文件。
  • 什么是note?您的循环处理一个名为“notes”的数组。
  • 无需使用循环和if 语句将数组的一条记录归零。只需在没有循环的情况下对notes[s] 进行分配。

标签: arrays c struct record delete-record


【解决方案1】:

一次写入一条记录,而不是写入整个数组。然后你可以简单地跳过你要删除的那个。

{           
    zfp = fopen("note.txt", "wb");
    if (fp == NULL)
    {
          printf("| File can not be opened.\n");
          exit(1);
    }
    for(int k = 0; k < len; k++)
    {
        if(k != s)
        {
            write(&notes[k], sizeof(notes[k]), 1, fp);
        }
    }
    fclose(fp);
}

【讨论】: