升序排列文件的数量

时间:2014-11-07 05:47:50

标签: c

如何读取包含两列的文件并按升序对第一列编号进行排序,并使用C将它们与相应的第二列值一起打印?

1 个答案:

答案 0 :(得分:0)

fopen会打开一个文件。

fscanf从文件读取并根据格式规范将读取的内容拆分(例如"%d %s"表示一个整数,后跟空格后跟一串非空白字符)。

qsort是一个标准库函数,用于对数组进行排序。它通过比较一个项目与另一个项目来对数组进行排序。你给它一个函数的名称(你写的)进行这种比较。

如果您不熟悉这些功能,我建议您阅读这些功能的手册页。

以下程序将所有这些用于:

  1. 打开文件test.txt
  2. 将文件中的行读入数组arr
  3. 使用qsort使用rowcmp函数对数组进行排序(rowcmp查看第一列中的数值以确定一个元素是否大于,等于或小于另一个元素)
  4. 打印出数组的元素。
  5. 代码......

    #include <stdio.h>
    #include <stdlib.h>
    #define MAXLEN 100
    #define MAXITEMS 100
    
    // A row has two columns, the first is a number and
    // the second is any string of up to MAXLEN chars
    struct row {
        int col1;
        char col2[MAXLEN];
    };
    
    // Function to do comparison of rows
    // Sorts numerically on the value in the first column
    int rowcmp(struct row * r1, struct row * r2) {
        if (r1->col1 < r2->col1) return -1;
        if (r1->col1 == r2->col1) return 0; 
        return 1; 
    }
    
    int main(int argc, char ** argv) {
    
        struct row arr[MAXITEMS]; // up to MAXITEMS rows
        int rows = 0, i;
        FILE * stream = fopen("test.txt", "r");
    
        // Read in rows and put first and second columns into struct,
        // building up an array
        while (fscanf(stream, "%d %s", &(arr[rows].col1), arr[rows].col2) !=EOF) {
            rows++;
        }
    
        // Sort the array using the rowcmp function to compare items
        qsort(&arr[0], rows, sizeof(struct row), (__compar_fn_t)rowcmp);
    
        fclose(stream);
    
        // Print the sorted array
        for (i=0; i<rows; i++) {
            printf("%d\t%s\n", arr[i].col1, arr[i].col2);
        }
    }
    

    使用输入文件:

    1 apple
    3 cucumbers
    21 dates
    7 figs
    4 grapes
    

    输出

    1   apple
    3   cucumbers
    4   grapes
    7   figs
    21  dates