如何按行对文本文件进行排序?

时间:2017-05-07 12:53:02

标签: c arrays sorting

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

文件1:

asazxz
dsa dsasd 
dsds tut
pewoq

file2的:

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;
}

我在文件3中合并了file1和file2

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

一个是经过两个较长的文本,找到一个\ n和所有文本,直到\ n被放入一个数组并对数组进行排序,然后将排序数组的每个元素放在一个line form file3。

另一个是通过file3尝试以某种方式按字母顺序切换行,就像bubblesort一样。

编辑:设法做到了,只需要一些方向,谢谢大家

2 个答案:

答案 0 :(得分:2)

作为口头程序,你可以这样做:

  1. 分配一系列指向字符的指针

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

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

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

  5. 排序后,从阵列中重写Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\Denis\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__ return self.func(*args) File "C:\Users\Denis\Desktop\Python\Sunday Work.py", line 47, in <lambda> RegistrationButton = Button(userRegister,text="Register",font=("monaco", 10),width=30,relief="groove",command=lambda: accountRegister(RegistrationUsernameEntry.get(),RegistrationPasswordEntry.get())).place(x=26,y=230) AttributeError: 'NoneType' object has no attribute 'get'

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

答案 1 :(得分:1)

如果您真的想在C中执行此操作,您可能需要使用getline (3)函数读取整个文件,并将结果放在链接列表中,以防您不知道该行的行数文件。

完成后,您只需将strcmp (3)与您选择的排序算法(冒泡排序,插入排序等)一起使用。

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

修改

正如@alk的评论中所提到的,我认为如果您不知道文件的大小,您的程序最好使用链接列表而不是常规数组。

<强>临: 您不知道文件的大小,使用数组会强制您使用realloc (3),因为realloc函数实际上创建了一个新指针,复制了指向的日期的全部内容,这会随着时间的推移而耗费资源。你的旧指针,并释放旧指针。如果文件相对较短,那应该不是问题,但是当你开始拥有大文件时,它可能是一个关于性能的问题。

<强> N : 链接列表有效地使您的工作复杂化。解决这个问题的方法是创建你自己的一般喜欢列表库,并在你需要的项目中使用它,这样你只需要做一次。