如何读取包含两列的文件并按升序对第一列编号进行排序,并使用C将它们与相应的第二列值一起打印?
答案 0 :(得分:0)
fopen
会打开一个文件。
fscanf
从文件读取并根据格式规范将读取的内容拆分(例如"%d %s"
表示一个整数,后跟空格后跟一串非空白字符)。
qsort
是一个标准库函数,用于对数组进行排序。它通过比较一个项目与另一个项目来对数组进行排序。你给它一个函数的名称(你写的)进行这种比较。
如果您不熟悉这些功能,我建议您阅读这些功能的手册页。
以下程序将所有这些用于:
test.txt
arr
qsort
使用rowcmp函数对数组进行排序(rowcmp查看第一列中的数值以确定一个元素是否大于,等于或小于另一个元素)代码......
#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