Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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_File_Input_Large Data - Fatal编程技术网

C程序文件读写技术

C程序文件读写技术,c,file,input,large-data,C,File,Input,Large Data,这是我第一次创建一个包含文件读写的程序。事实上,我想知道做这件事最好的技巧是什么。因为当我把我的工作和我的同学比较时,我们的逻辑是非常不同的 你看,我们的老师让我们做一个简单的学生名单系统,用户可以添加、编辑和删除记录。他要求我们制作一个文件来保存所有记录,以便我们下次使用该程序时可以访问它 我解决这个问题的方法是,在程序打开菜单之前,我读取其中的所有记录并将其保存在数组[]中。通过这样做,我可以操纵所有记录。然后在用户退出程序之前,我将其保存在同一个文件中,并覆盖其中的所有记录 我同学的答案是

这是我第一次创建一个包含文件读写的程序。事实上,我想知道做这件事最好的技巧是什么。因为当我把我的工作和我的同学比较时,我们的逻辑是非常不同的

你看,我们的老师让我们做一个简单的学生名单系统,用户可以添加、编辑和删除记录。他要求我们制作一个文件来保存所有记录,以便我们下次使用该程序时可以访问它

我解决这个问题的方法是,在程序打开菜单之前,我读取其中的所有记录并将其保存在数组[]中。通过这样做,我可以操纵所有记录。然后在用户退出程序之前,我将其保存在同一个文件中,并覆盖其中的所有记录

我同学的答案是这样的。添加记录时,她访问文件并附加数据;编辑记录时,她访问文件并编辑特定记录;删除记录时,她访问文件并删除记录。所以她做的每一个功能都是访问文件

当然,我们的两项工作都可以进行编码。但我想知道,如果我们处理数千或数百万条记录,使用哪一条更有效。或者还有比我们做的更好的解决方案吗。也许你可以和我们分享你的文件处理经验。。。谢谢。

您的版本(将所有记录保存在内存中)可能会更快。如果记录计数增加,则需要有足够的内存。这样做的坏处在于,程序崩溃或不正确的退出会使您丢失所有数据,因为这些数据从未保存到文件中


你的同学版本不会那么快,因为文件io不是你能做的最快的。但是它需要更少的内存,在崩溃时更安全,因为大多数数据都已经在文件中。

在任何严肃的应用程序中,一个好的程序员可能会使用现有的库来管理数据。选择此工具取决于具体要求:

  • 它是否需要由多个用户同时访问
  • 是否需要从多台机器访问它

  • 存储大量信息的最常见选择是基于SQL的数据库,如MySQL、Postgres、Microsoft SQL Server、SQLite等。这些数据库与同学的解决方案相比,更像同学的解决方案。

    这是一个无法回答的问题,如果不知道运行它的系统的详细信息,数据集的大小,以及开发时间与cpu时间的相对成本。如果系统有足够的内存,则最好在ram中处理副本。在一个ram非常有限的小型系统中(目前主要存在于嵌入式应用程序中),您可能需要更新磁盘文件。其他需要考虑的事情是,在实际写入磁盘之前,操作系统可能会进行任何缓冲,如果程序崩溃,文件的一致性会发生什么情况,甚至写入磁盘是“昂贵的”,因为写入速度非常慢或写入周期有限(一些闪存磁盘技术)

    如果在今天的台式计算机上这是一个小的实际问题,你可能还需要考虑在不同的时间上开发各种解决方案的时间。
    此外,今天最好使用一个擅长处理相关问题的现有数据库来解决问题,而不是在文件系统中创建自己的数据库。

    这是一个在编程中会反复遇到的经典案例:我是否优化了速度或内存使用?

    而且,像所有这些难题一样,没有“正确”的答案或完美的解决方案。换句话说,你和你的同学在解决问题上都是正确的

    通过将所有记录加载到内存中的解决方案,您可以“花费”内存,以便在运行时更快地访问和修改这些记录。将所有记录存储在内存阵列中会占用空间,但由于内存访问几乎比磁盘访问快无穷多,因此您的方法将比您的同学的方法运行得快得多

    相比之下,你的同学通过等待从硬盘按需加载数据来节省RAM。但这会让她付出代价:与获取已经存储在内存中的数据相比,访问硬盘是一个极其昂贵的过程,每次用户做出更改时,她都会被困在这一过程中。想想启动一个程序需要多长时间,而不是切换到一个已经打开的程序

    这就是折衷。以下是一些需要问问自己的重要问题:

  • 数据集(在您将要处理的常见配置中)是否太大(或将变得太大)而无法完全放入内存?如果您处理的是典型的小数据集,那么计算机现在有足够的RAM,这可能是值得的

  • 您需要多快才能访问数据?实时访问重要吗?它是否是一个特别大或复杂的数据集,需要很长时间才能按需从硬盘加载?您的用户期望什么样的性能

  • 您的应用程序的目标是什么样的系统?有时嵌入式系统和其他特殊情况需要它们自己独特的设计方法。您可能有丰富的RAM和非常有限的固定存储,或者您可能正好相反。如果您使用的是标准的现代PC硬件,您的用户想要/需要/已经拥有什么?如果您的大多数目标用户已经在使用相对“坚固”的硬件,那么您可能会做出不同的设计决策,而不是针对更大的潜在受众。您肯定已经看到,这些权衡在之前通过程序的表达系统得到了明确的体现