2014-05-09 26 views
2

您好,我想用C语言编写一个排序软件。它根据行的第一个字符对文本行进行排序。我想把V开头的V与Vs.所以以V开头的字母行会被排序在一起。任何人都可以指导我如何做到这一点?根据第一个字符对文本进行排序 - C编程

f -0.80811 -0.520398 -0.275942 

    v 0.0146114 -0.0939821 0.00366211 
    v 0.0133369 -0.0926109 0.00480863 
    v 0.0142794 -0.0932492 0.00325213 



    f -0.788618 -0.530816 -0.310349 

    v 0.0146114 -0.0939821 0.00366211 
    v 0.0142794 -0.0932492 0.00325213 
    v 0.0144766 -0.0933648 0.00294873 



f -0.726784 -0.686213 0.0299526 

v 0.0154684 -0.0952972 0.00472045 
v 0.0158173 -0.0956479 0.00515121 
v 0.0150361 -0.0947439 0.00690701 
+8

是非常大的文件?或者你可以将所有的文件读入内存(成行)和'qsort()'它? – pmg

+1

你不能使用shell/Python脚本吗?如果**必须是C,则使用'stdlib'的'qsort()'。 –

+0

它是巨大的..大约500k〜700k行.. – adventsyracuase

回答

1

这个概念证明可以满足您的需求。 但它会更容易
$排序file.txt的

免责声明:这是我的第一篇堆栈溢出,所以如果我做错了什么,请告诉我。 :)

这是8MiB(sizeof(char *)* 1024 * 1024)的内存开销。它还将文件的全部内容存储在内存中。消耗大约60Mib的RAM。

#define _POSIX_C_SOURCE 200809L 
#include <stdio.h> 
#include <stdlib.h> 

#define LINES_IN_FILE 32 

int compare(const void *ap, const void *bp) 
{ 
    char **a = (char **)ap; 
    char **b = (char **)bp; 

    return strcmp(*a, *b); 
} 

int main(void) 
{ 
    FILE *in = fopen("text.txt", "r"); 
    if (!in) 
     return 1; 

    char **pbuf, **buf; 
    pbuf = buf = malloc(sizeof (char *) * LINES_IN_FILE); 

    size_t count = 0, len = 0; 
    while (getline(pbuf, &len, in) != -1) { 
     pbuf++; 
      count++; 
     len = 0; 
    } 

    qsort(buf, count, sizeof(char *), compare); 

    /* cleanup and print or whatever */ 
    return 0; 
} 

可以通过用测试替换的strcmp()函数仅比较第一字节,即一个位加快这如果(* A [0]> * B [0])...

1

的快捷方式(我没有想太多复杂性)是:

  1. 创建一个结构

    结构CharIntPair { INT lineNr; char firstChar; };

  2. 读取每行的第一个字符并创建一个行号和第一个字符的数组。

  3. 编写你的比较函数并使用qsort根据字母对数组进行排序。
  4. 对于数组中的每个字母,将元素复制到子数组(复杂度为O(n),因为它已经排序)。
  5. 写另一个比较功能根据行号
  6. 阅读分拣线每个子阵列进行排序...
1

这种问题应该由(按优先)来解决

  1. 使用特定的工具,sort在这种情况下
  2. 编程脚本语言,例如Perl或Python
  3. 编程在“低级别”编程语言中,如C

除非特定工具不可用或者这个问题只是较大项目的一小部分,否则您应该选择方法一。在以前的情况下,你应该尝试第二种方法;在后者中,您应该选择在较大项目中使用的编程语言。

相关问题