Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保存使用列表修改的文件(c语言)_C_List_File_Memory_Complexity Theory - Fatal编程技术网

保存使用列表修改的文件(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你看到我的答案了吗?如果有帮助,请标记