保存使用列表修改的文件(c语言)
===============================================================================保存使用列表修改的文件(c语言),c,list,file,memory,complexity-theory,C,List,File,Memory,Complexity Theory,=============================================================================== 编辑:很抱歉,我似乎没有解释清楚 我的程序所做的是 打开文件阅读从文件加载列表用户选择的操作将应用于列表(非文件)(添加搜索显示重置)\导入文件更改(如果有) 如果用户选择仅添加一名员工并退出,是否最好将添加的节点附加到文件末尾,关闭并释放列表或打开文件以读取并覆盖文件中的所有节点 最后一个选项将为我节省大量的代码行,但它是否会在执行时为
编辑:很抱歉,我似乎没有解释清楚
我的程序所做的是
打开文件阅读
从文件加载列表
用户选择的操作将应用于列表(非文件)
(添加搜索显示重置)\导入文件更改
(如果有)如果用户选择仅添加一名员工并退出
,是否最好将添加的节点附加到文件末尾,关闭并释放列表或打开文件以读取并覆盖文件中的所有节点
最后一个选项将为我节省大量的代码行,但它是否会在执行时为用户节省时间和精力
=============================================================
我正在从事一个(c语言)学校项目,我们必须同时使用列表
和文件
来:
- 显示员工列表
- 添加员工
- 搜索员工
- 重置列表
- 保存并退出
因此,我正在寻找最好的方法,据我所知,好的代码可以确保程序尽可能少地使用内存,并且尽可能快。
我要问的是
打开包含员工信息的文件并将其加载到列表中,然后通过添加
或重置
修改列表后,是否最好:
- 打开“w”的文件并用列表填充它
- 或者打开它,从上一个员工添加“a+”
请注意,最后一种方法是我必须记住行(又名节点)的初始数量,并查找“初始最后一个节点”以从中开始加载。
注:员工变量为名
姓
和工资
;验证(文件)返回1;如果未打开文件,则返回0
void load_file(list *list, char *filename)
{
if (current_number_of_lines != initial_number_of_lines || list_reset == 1)
{
if (current_number_of_lines > initial_number_of_lines && list_reset == 0)
{
FILE *file = fopen(filename, "a+");
if (VERIFY(file) == 1)
{
for (int i = 0; i < initial_number_of_lines; i++)
{
list = list->next;
}
while (list != NULL)
{
fprintf(file, "%s\t%s\t%lf\n", list->emp.Fname, list->emp.Lname, list->emp.salary);
list = list->next;
}
}
fclose(file);
}
else if (list_reset == 1)
{
FILE *file = fopen(filename, "w");
while (list != NULL)
{
fprintf(file, "%s\t%s\t%lf\n", list->emp.Fname, list->emp.Lname, list->emp.salary);
list = list->next;
}
fclose(file);
}
else
printf("Error\n");
}
freeList(list);
}
void load_文件(列表*列表,字符*文件名)
{
如果(当前行数)=初始行数=列表重置=1)
{
如果(当前行数>初始行数和列表重置==0)
{
FILE*FILE=fopen(文件名为“a+”);
如果(验证(文件)==1)
{
for(int i=0;i<初始行数;i++)
{
列表=列表->下一步;
}
while(list!=NULL)
{
fprintf(文件,“%s\t%s\t%lf\n”,列表->emp.Fname,列表->emp.Lname,列表->emp.salary);
列表=列表->下一步;
}
}
fclose(文件);
}
else if(list_reset==1)
{
FILE*FILE=fopen(文件名,“w”);
while(list!=NULL)
{
fprintf(文件,“%s\t%s\t%lf\n”,列表->emp.Fname,列表->emp.Lname,列表->emp.salary);
列表=列表->下一步;
}
fclose(文件);
}
其他的
printf(“错误\n”);
}
自由列表(列表);
}
如果您使用“w”来表示fopen(),则它会将文件截断为零长度或创建用于写入的文本文件。流位于文件的开头。您必须将所有记录写入该文件
如果将“a+”用于fopen(),则该文件将打开以进行读取和追加(在文件末尾写入)。如果文件不存在,则创建该文件。输出总是附加到文件的末尾。警告:使用此模式时,POSIX不会显示初始读取位置。在模式中,您将只写入需要添加的记录
还请注意,这两种方法都不适合在两个或多个应用程序之间共享数据
如果在列表的末尾添加了新记录,那么将这些记录附加到文件末尾(“a+”模式)显然会更快
由于您有一个文本文件(由文本行组成),很遗憾,无法更新更改的记录。在这种情况下,必须将列表中的所有内容写入文件(“w”模式)
如果为了使用固定大小的记录而更改文件格式,则可以通过将文件定位在记录上然后写入来优化写入。为此,将记录定义为包含固定大小字符串的结构。当然,在该结构中添加一个项以记住从列表中读取它的位置。如果所有的add
操作都将新节点添加到列表的末尾,那么使用a+
将获得更好的性能。另一方面,如果总是重写整个文件,代码会更简单。那么什么对你来说最重要呢?性能还是简单代码?我将从简单的方法开始
其他一些注释
非常奇怪的是,当函数实际写入文件时,调用函数load\u file
变量:当前行数
,初始行数
,列表重置
似乎是全局变量。使用全局变量是应该避免的
逻辑(也称为if
语句)似乎太复杂了。您可以简单地执行以下操作:
void load_file(list *list, char *filename)
{
if (list_reset == 1)
{
...
}
else if (current_number_of_lines > initial_number_of_lines)
{
...
}
else if (current_number_of_lines < initial_number_of_lines)
{
printf("Error\n");
}
freeList(list);
}
void load_文件(列表*列表,字符*文件名)
{
如果(列表\重置==1)
{
...
}
else if(当前\u行数\u>初始\u行数\u)
{
...
}
else if(当前\u行数\u<初始\u行数\u)
{
printf(“错误\n”);
}
自由列表(列表);
}
如果删除元素,则必须重写该文件。对我来说,奇怪的是,当代码似乎写入该文件时,函数名为load\u file。编辑我的答案以根据您在问题中的更改给出提示。请再读一遍我的答案。@omayma你看到我的答案了吗?如果有帮助,请标记