你好我试图用c编程语言对文本文件进行排序,
为了使用唯一键对文件进行排序,
我需要能够从一行跳到另一行才能对文件进行排序,问题是我不知道c中是否有命令让我从第一行跳转到让我们说
以20行为例
我所知道的唯一解决方案是每次使用带循环的fscanf
但这个解决方案不是很有效
编辑:
我遇到的另一个问题是我无法将所有文件读取到内存中
它在文件管理过程中给出的某种赋值我只能在实际排序时读取2条记录
事情是这不是二进制文件, 像
这样的选项 fseek(filepointer,number of bits,SEEK_SET)
在这里无法帮助我,因为我需要跳线
提前感谢您的时间。
答案 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的循环来获取每一行,直到找到您感兴趣的那一行。这是蛮力的方法,可能会冒犯你的审美感,但是发明了计算机来做这类工作。
有一种更优雅的方式来跳绳,但这也可能是你教授希望你解决的问题之一,所以我不会在这里提到它。