2017-05-07 64 views
0

我想知道一個簡單的方法來按行排序文本文件。 我有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; 
} 

我在一個文件3

合併文件1和文件2

我有一些想法,我可以排序文件3的行,但我真的不知道如何使它們發生。

一個正在經歷兩個較長的文本,找到一個\ n和所有的文本,直到\ n被放入一個數組,然後排序數組,然後將排序數組的每個元素放在一個線形文件3。

另一個正在通過file3並嘗試以某種方式以alphabitically方式切換行,如bubblesort。

編輯:設法做到這一點,只是需要一些指導,感謝大家

+2

你可以使用linux sort命令? –

+2

考慮到的「計算機程序設計第3卷的藝術」一大塊致力於回答這個領域,我認爲這是海報孩子「太寬」的問題。 –

+0

第一個循環的目的是什麼? –

回答

1

簡單的方法:閱讀文本文件合併成一個陣列(第二個文件的第一行之後的第一個文件(提示的最後一行:fgets ),對數組進行排序(提示:qsort),然後輸出。

1

如果你真的想用C語言來完成,你可能需要使用getline (3)函數來讀取整個文件,並將結果放入一個鏈接列表中如果您不知道文件的行數

完成後,您可以簡單地使用strcmp (3)以及您選擇的排序算法(冒泡排序,插入排序等)。

然後,您可以重新打開文件進行寫入並插入已排序的鏈接列表。


編輯

如要求由@alk的意見,我認爲它會爲你的程序中使用鏈表,而不是規則排列的情況下,你不知道的大小會更好的文件。

: 你不知道你的文件的大小,使用數組會強迫你使用realloc (3)這將隨着時間的推移是昂貴的資源爲realloc函數實際上創建了一個新的指針,複製全部內容舊指針指向的日期,並釋放舊指針。如果文件相對較短,這應該不是問題,但是當您開始擁有大文件時,這可能是性能方面的問題。

合同: 鏈接列表有效地將您的工作複雜化。解決方法是創建自己的普通列表lib,並將其用於需要的項目中,因此您只需執行一次即可。

+0

鏈表不會使這一點複雜化嗎?如果提出這種先進的數據結構解釋其優點(和缺點)可能是值得的。 – alk

+1

@alk非常正確,只是添加了解釋來幫助OP做出他的選擇。 –

2

作爲口頭程序,你可以這樣做:

  1. 分配指針數組字符

  2. 讀取文件的所有行。爲每行分配一個新字符串並放入數組中

  3. 如果數組太小,則使用realloc使其更大。閱讀有關realloc以避免常見錯誤。

  4. 一旦該文件已被讀取,使用自己的冒泡排序或圖書館的qsort到數組排序。閱讀關於qsort

  5. 一旦排序,從所述陣列重新寫file3

編碼這是一個很好的練習,我留給你。