Перемешать текст с C - PullRequest
       0

Перемешать текст с C

0 голосов
/ 23 января 2011

Я хотел бы получить мнение здесь. Можно ли написать программу на C, которая перетасовывает текстовый файл? Что я имею в виду под этим? Скажем, у меня есть следующие данные в текстовом файле:

1  X
4  T
3  Z
2  L

И я хотел бы перестановить его и вывести другой файл так:

1  X
2  L
3  Z
4  T

Так, что все данные, следующие за номером, сохраняются с фактическим порядковым номером. Знайте, что у меня 40 500 перемешанных сущностей, так что это, вероятно, следует принять во внимание, так как это может занять много времени, если программе потребуется выполнить цикл по всем сущностям для каждой сущности ... И я только использовал буквы для представления. Фактические файлы данных не имеют букв, а имеют с плавающей точкой . Извините, если это вызывает путаницу

Итак, суть, возможно ли это с C? И если да, могу ли я получить подсказку, с чего начать? Я мог бы, очевидно, ввести все данные текстового файла в массив dat[][], но как мне тогда его переставить?

Спасибо! Amit

Ответы [ 5 ]

3 голосов
/ 23 января 2011

Посмотрите qsort, его часть stdlib.

2 голосов
/ 23 января 2011

Я бы просто использовал sort -n вместо написания программы.

2 голосов
/ 23 января 2011

Если вы знаете самый большой индекс в файле и в нем нет дыр (т.е. все индексы присутствуют), вы можете создать массив такого размера, а затем, когда вы читаете каждую строку файла, поместите данные в правильные расположение в массиве. Когда вы закончите чтение файла, ваш массив будет иметь все элементы в правильном порядке.

1 голос
/ 23 января 2011

Вы можете построить vector< pair<int,float[4]> > и просто отсортировать его с помощью STL.

Только что заметил тег c .... Но идея C примерно такая же:

Построить массив с данными:

struct pair
{
    int idx;
    float val[4];
}

pair *data;

А потом просто сортируй.

0 голосов
/ 23 января 2011

Для тех, кто заинтересован, я написал серию циклов для написания этой программы, код показан ниже.Единственным недостатком является то, что если моя переменная nrow равна 40 500, эта программа может занять до 30 минут для запуска на двухъядерном компьютере с тактовой частотой 3 ГГц.Я уверен, что есть способы оптимизировать его, хотя, по крайней мере, он делает то, что я хочу ... пока.

Вот код:

#include "stdlib.h"
#include "stdio.h"

// Deshuffle the output files of the bond/swap mode

int main(int argc, char* argv[])
{
    if (argc < 4) {
        printf("\ndeshuffle usage: [number of chains] [number of atoms] [.dat file] \n");
        exit(1);
    }

    int i,j,k,l;
    int nch = atoi( argv[1] );
    int ns = atoi( argv[2] );
    double **in_dat, **s_dat, dm1;

    int nrow = ns*nch;

    in_dat = (double**) calloc(nrow, sizeof(double*));
    s_dat = (double**) calloc(nrow, sizeof(double*));
    for (i=0; i<nrow; i++) {
        in_dat[i] = (double*) calloc(6, sizeof(double));
        s_dat[i] = (double*) calloc(6, sizeof(double));
        for (j=0; j<6; j++)
            in_dat[i][j] = 0.0;
            s_dat[i][j] = 0.0;
    }

    // store input data into 2D array in_dat
    FILE *inp;
    inp = fopen( argv[3], "r" );

    for (i=0; i<nrow; i++) {
        for (j=0; j<6; j++) {
            fscanf(inp, "%lf", &dm1);
            in_dat[i][j] = dm1;
        }
    }

    fclose(inp);

    // Sort data in s_dat based on comparison with in_dat
    k=0; 
    while (k < (nrow)) {
        for (i=0; i<nrow; i++) {
            for (l=0; l<nrow; l++) {
                if (in_dat[l][0] == (k+1)) {
                    for (j=0; j<6; j++) {
                        s_dat[i][j] = in_dat[l][j];
                    }
                    k++;
                    break;                  
                }
            }
        }
    }

    // Write sorted data to file

    FILE *otp;
    otp = fopen("results.out", "w");

    for (i=0; i<nrow; i++) {
        for (j=0; j<6; j++) {
            fprintf(otp, "%lf \t", s_dat[i][j]);
            if (j==5)
                fprintf(otp, "\n");
        }
    }

    fclose(otp);

    printf("\n Done. \n\n");

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...