【问题标题】:How to edit text file at specific line C [closed]如何在特定的 C 行编辑文本文件 [关闭]
【发布时间】:2013-10-15 13:44:15
【问题描述】:

我目前在 Windows XP 中使用 MinGW。

我编写了一个程序,该程序接受用户的输入并通过

将它们放入 .txt 文件中
typedef struct data_base{
    char name[254];
    int age;
    int postalcode;
    struct data_base *next;
}person;

我想知道是否有办法编辑 .txt 文件的数据。

例如,在.txt文件中,根据用户的输入,我有3组数据:

Steven    //name
19        //age
1100      //postal code
Jack 
24
2203
Mary
21
0109

我会询问用户他希望编辑哪组数据。然后在获取编辑后的数据后,我希望在用户选择的特定集的 .txt 文件中覆盖该数据。


#include <stdio.h>
#include <stdlib.h>

typedef struct data_base{
    char name[254];
    int age;
    int postalcode;
    struct data_base *next;
}person;

void read()
{
person *curr[20];
int count = 0;
FILE *f;
int editchoice = 0;

f = fopen("personfile.txt","r+");
// Read the data in the file based on user's input

//Display the names: 1. Steven 2.Jack  3.Mary
printf("Editing Whose Data?: \n");
scanf("%d",&editchoice);    

printf("New name: \n");
scanf("%s",&curr[editchoice]->name);
fprintf(f,"%s\n",curr[editchoice]->name);

printf("New age: \n");
scanf("%d",&curr[editchoice]->age);
fprintf(f,"%d\n",curr[editchoice]->age);

printf("New name: \n");
scanf("%d",&curr[editchoice]->postalcode);
fprintf(f,"%d\n",curr[editchoice]->postalcode);

}

我预计数据会被覆盖,但它没有发生。 (对不起,我是初学者。)

【问题讨论】:

  • 你能展示你试过的代码吗?
  • 您为什么希望文件被更新?你没有更新它。为了更新文件,您需要将文件定位到要更新的记录并使用fwrite 覆盖它。

标签: c file-io


【解决方案1】:

是的,你快到了。

对我来说,你有两个选择。 或者您在内存中(在列表中)更改该文件,然后将列表转储到文件中。 或者您更改文件并将文件重新读入内存(到该列表)。

或者

您可以通过将文件光标定位在要更改的数据的开头并更改它来更改文件中的数据,但是您还应该更新内存中的数据。

我解决这个问题的方法是:

编写一个函数,在文件中提供一个“id”位置的人块,这样你就可以读取和写入人的数据到文件中。

【讨论】:

  • 由于数据是可变长度的,因此您必须覆盖要更改的记录以及之后的每条记录。
  • 是的,你是对的,不过我看到了那个字符名[254];年龄;国际邮政编码; name 最多可容纳 254 个字节(字符)。该块中的所有数据的最大长度为 254 + 4 + 4 = 258 字节。未使用的字符可以用 '\0' 字符放置。而且你有 258 个字节的块。
  • 是的,您可以使用固定的记录长度来避免重写大部分文件。这是一个需要权衡磁盘空间和性能的设计决策。
  • 现在取决于他的方法。数据在存储和内存中应该是一致的。
  • 我决定应用您的想法并执行以下操作:1)打开文件并将文件的所有数据存储到链表中 2)关闭文件 3)重新打开文件,但现在使用“w+ ", 4) 获取新数据 5) 关闭文件 6) fprintf 链表的所有数据和新数据到文件中。
【解决方案2】:

您可以从一个文件中读取,然后将结果写入另一个文件。

逐条读取,

如果记录有你想改变的人然后改变

然后

在您将记录读入 tmp 文件时将其转储,这将包括发生更改时的记录。

然后关闭两个文件,remove 旧文件,rename tmp 文件。

【讨论】:

  • 如果文件包含数百万条记录怎么办?重写数百万条记录以仅更改一条记录非常昂贵。
  • 我同意你的观点,但是对于初学者来说这是一个好的开始。尤其是在同一个文件上准备和写入,如果不小心完成,可能会导致问题
猜你喜欢
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多