使用c在文件中跳线

时间:2011-03-10 16:07:42

标签: c file

你好我试图用c编程语言对文本文件进行排序, 为了使用唯一键对文件进行排序, 我需要能够从一行跳到另一行才能对文件进行排序,问题是我不知道c中是否有命令让我从第一行跳转到让我们说 以20行为例 我所知道的唯一解决方案是每次使用带循环的fscanf 但这个解决方案不是很有效 编辑:
我遇到的另一个问题是我无法将所有文件读取到内存中 它在文件管理过程中给出的某种赋值我只能在实际排序时读取2条记录

事情是这不是二进制文件, 像

这样的选项
 fseek(filepointer,number of bits,SEEK_SET)

在这里无法帮助我,因为我需要跳线

提前感谢您的时间。

5 个答案:

答案 0 :(得分:1)

C库没有跳转到文件中特定行的功能。

您可以执行的操作(将整个文件读入内存不足)通过文件读取一次,并将每行的起始位置存储到数组中。使用该数组,您可以直接搜索每一行的开头。

但是你可以更进一步:因为你根据一个键对文件进行排序,所以不需要一直读取整行。您可以读取文件一次,将行的键及其文件位置存储在内存中并对其进行排序。

最后,探索其他不需要随机文件访问的排序算法(以IO限制性能为代价)可能会很有用 - 想到Mergesort。

答案 1 :(得分:0)

逐行将文件读入数组(char *[]),然后对其进行排序。在文本文件中跳转非常困难;在原地进行洗牌甚至更难。

如果占用太多内存,请从头到尾读取文件,而只在off_t数组中存储每行的起始偏移量。但是,这并不能解决就地修改/排序的问题,当您进行实际排序时,它可能会变得非常慢。

答案 2 :(得分:0)

ftell,fseek和fsetpos的堆积帮助可能是为了跟踪每行在文件中的位置。

此外,如果线条不是固定宽度,那么交换线条将非常困难。

祝你好运。

答案 3 :(得分:0)

文本行的顺序读取可以使用fgets()完成,如果以固定长度构造,fseek对文本删除没有帮助。

是否允许mmap()?因为如果是这样,你可以解析内存并在数组中存储行偏移量(可能使用realloc增长)。然后你会的 能够使用qsort()函数,如果重新读取每一行的所有行,则在O(n log n)而不是O(n ^ 2)中工作。

祝你好运!

答案 4 :(得分:-1)

跳线部分实际上很简单。要阅读特定的行,只需寻找文件的开头并使用带有fgets的循环来获取每一行,直到找到您感兴趣的那一行。这是蛮力的方法,可能会冒犯你的审美感,但是发明了计算机来做这类工作。

有一种更优雅的方式来跳绳,但这也可能是你教授希望你解决的问题之一,所以我不会在这里提到它。