2014-11-07 4 views
-4

Как прочитать файл, который содержит два столбца и отсортировать первые номера столбцов в порядке возрастания и распечатать их с соответствующими значениями 2-го столбца с помощью C?Порядок сортировки чисел в порядке возрастания

+0

Добро пожаловать на переполнение стека. Ваш вопрос будет лучше принят, если вы будете следовать рекомендациям, которые представлены вам в разделе «Как спросить» справа, когда вы задаете вопрос. http://stackoverflow.com/help – GreenAsJade

+0

Чтобы начать работу, сначала прочитайте строку из файла (см. 'scanf',' fgets' или 'getline') и сохраните их в структуре данных (массив указателей на char будет работать). Затем работайте над разбором первого столбца во что-то, что можно сортировать (возможно, массив). Затем сортируйте по первому столбцу, применяя результаты к вашему массиву указателей. Поработайте над этим, объедините свой код вместе с образцами данных и обновите свой вопрос. Это послужит основой для помощи. –

+0

использовать сортировку или использовать awk или perl. – BLUEPIXY

ответ

0

fopen открывает файл.

fscanf считывает из файла и разбивает то, что считывается в биты согласно спецификации формата (например, "%d %s" означает целое число, за которым следует пробел, за которым следует строка символов без пробелов).

qsort - это стандартная функция библиотеки, которая будет сортировать массив. Он сортирует массив, сравнивая один элемент с другим элементом. Вы даете ему имя функции (которую вы пишете), которая делает это сравнение.

Я рекомендую вам прочитать страницы руководства для этих функций, если вы не знакомы с ними.

ниже Программа использует все это:

  1. Открыть файл test.txt
  2. прочитанной строка из файла в массив arr
  3. Сортировки массив с помощью qsort, используя функцию rowcmp (rowcmp выглядит при числовом значении в первом столбце, чтобы определить, является ли один элемент больше, равным или меньшим, чем другой элемент)
  4. Распечатайте элементы массива.

Код ...

#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 
Смежные вопросы