【问题标题】:How to sort a text file by lines?如何按行对文本文件进行排序?
【发布时间】:2017-05-07 12:53:01
【问题描述】:

我想知道一种按行对文本文件进行排序的简单方法。 我有 2 个文件:

文件1:

asazxz
dsa dsasd 
dsds tut
pewoq

文件2:

uiosda dsds
poisss

我当前的代码是:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char *argv[]){

int nrf1=0;
int nrf2=0;

FILE *f1=NULL;
FILE *f2=NULL;
FILE *fe=NULL;
f1=fopen(argv[1],"r");
f2=fopen(argv[2],"r");
fe=fopen(argv[3],"w");

if (f1==NULL || f2==NULL || fe==NULL){
printf("couldn't open a file \n");
return 1;
}
char p;

while (1){
p=fgetc(f1);
if(p==EOF) break;
nrf1++;
    }

    while(1){
    p=fgetc(f2);
    if(p==EOF) break;
    nrf2++;
}

rewind(f1);
rewind(f2);

while ( (p = fgetc(f1))!= EOF )
        fputc(p,fe);

while ( (p = fgetc(f2))!= EOF )
        fputc(p,fe);

//if(nrf1>nrf2){
//printf("%s %d \n",argv[1],\nrf1);
//while( (p=fgetc(f1))!=EOF )
//
//}
//else{
//printf("%s %d \n",argv[2],nrf2);
//while( (p=fgetc(f2))!=EOF )
//
//}

rewind(fe);


fclose(f1);
fclose(f2);
fclose(fe);
return 0;
}

我将file1和file2合并到一个file3中

我对如何按行对文件 3 进行排序有一些想法,但我真的不知道如何实现它们。

一个是遍历两个中较长的文本,找到一个 \n 和所有文本直到 \n 被放入一个数组中并对数组进行排序,然后将排序后的数组的每个元素放在一个行格式文件3。

另一个正在检查 file3 并尝试以某种方式按字母顺序切换行,例如冒泡排序。

edit:设法做到了,只是需要一些指导,谢谢大家

【问题讨论】:

  • 可以用linux的排序命令吗?
  • 鉴于“计算机编程艺术第 3 卷”的大部分内容都致力于回答这个领域,我认为这是典型的“过于宽泛”的问题。
  • 第一个循环的目的是什么?
  • 对于像这样的小文件,我会将每一行读入一个 malloc 的数组(每次行太长时使用 realloc 将数组的大小加倍),并将这些行存储在数组(也分配和重新分配)。然后对行进行排序并写出来。
  • @MartinBonner 鉴于我可以在没有阅读那本书的情况下想到大约六种合理的解决方案,我不得不同意你的看法。

标签: c arrays sorting


【解决方案1】:

作为口头程序,您可以:

  1. 分配一个指向字符的指针数组

  2. 读取文件的所有行。为每一行分配一个新字符串并放入数组中

  3. 如果数组太小,则使用realloc 使其变大。阅读realloc 以避免常见错误。

  4. 读取文件后,使用您自己的冒泡排序或库的qsort 对数组进行排序。阅读qsort

  5. 排序后,从数组中重写file3

编码这是一个很好的练习,我留给你。

【讨论】:

    【解决方案2】:

    简单的方法:将文本文件读入一个数组(第二个文件的第一行在第一个文件的最后一行之后(提示:fgets),对数组进行排序(提示:qsort),然后输出。

    【讨论】:

      【解决方案3】:

      如果你真的想用 C 来做,你可能想用 getline (3) 函数读取整个文件,并将结果放在一个链表中,以防你不知道文件的行数。

      完成后,您可以简单地将strcmp (3) 与您选择的排序算法(冒泡排序、插入排序等)一起使用。

      然后您就可以重新打开文件进行写入并插入您的排序链表。


      编辑

      正如@alk 在 cmets 中所问的那样,我认为如果您不知道文件的大小,您的程序最好使用链表而不是常规数组。

      专业版: 您不知道文件的大小,使用数组会迫使您使用realloc (3),随着时间的推移,这会消耗大量资源,因为 realloc 函数实际上会创建一个新指针,复制旧指针指向的日期的全部内容指针,并释放旧指针。如果文件相对较短,这应该不是问题,但是当您开始拥有大文件时,它可能会成为性能方面的问题。

      骗局: 链表有效地使您的工作复杂化。一种解决方法是创建您自己的通用喜欢列表库,并在您需要的项目中使用它,因此您只需执行一次。

      【讨论】:

      • 链表不是让这点复杂吗?如果提出这种解释其优点(和缺点?)的高级数据结构可能是值得的。
      • @alk 非常正确,只是添加了解释以帮助 OP 做出选择。
      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2014-05-27
      • 2021-08-25
      • 1970-01-01
      • 2011-05-01
      • 2011-10-15
      相关资源
      最近更新 更多