读取文本文件并排序两个数组

时间:2018-02-19 02:45:08

标签: c arrays sorting readfile

我有一个200行的“Temp.dat”,如下所示:

0.060493 1 0.5 1
1.596961 0 0.1 2
0.87758  1 0.3 1.5
0.165453 1 0   3
0.07085  1 0.3 4
0.125379 1 0.2 3
0.454202 1 0.2 2
0.373227 1 0.3 1
0.131486 1 0.3 3
0.867477 0 0.5 4
0.122609 0 0.8 9

我正在尝试读取每一行并使用以下代码将每列数据存储到单独的数组中:

#include <stdio.h>
#include <stdlib.h>
#define MAX 200

int main(){

  double x[MAX], y[MAX];
  double a, b;
  int m = 0;
  FILE* file; 
  file = fopen("Temp.dat", "r");
  if ( file != NULL ){
      /* Read the two columns. */
      while(fscanf(file, "%d %d", &a, &b) == 2)
      { x[m] = a;
        y[m] = b;
        m++;
      }
  }
  printf("%d %d\n", x[4], y[1]); # Test the stored inputs of the two arrays
  return(0);
}    

当我尝试打印出结果时,它提供的是1 13258992,而不是0.165453 0。我无法理解这对1 13258992的位置,因为我认为行fscanf(file, "%d %d", &a, &b) == 2做了它应该做的事情:遍历文件Temp.dat的每一行并读取两个{{1}整数,然后存储在两个数组double-type和`y [MAX]中。因此,有人可以帮我解决这个问题吗?

另一个问题:将上面的两列存储在两个数组x[MAX]x[MAX]之后,我想根据第一个数组{{1}中的值按递增顺序对这两个数组进行排序}}。这看起来像是:

y[MAX]

我怎样才能在C中执行此x[MAX]例程,因为很难在 0.060493 1 0.07085 1 0.122609 0 0.125379 1 0.131486 1 0.165453 1 0.373227 1 0.454202 1 0.867477 0 中排列元素以遵循sorting中相应元素的顺序?

3 个答案:

答案 0 :(得分:1)

首先在&& m < MAX条件中添加while,这样您就不会溢出缓冲区。

scanf期望%d指向int,而不是double,它会将内容解析为整数。 您必须使用%lf来解析double。这同样适用于printf电话:

while(fscanf(file, "%lf %lf", &a, &b) == 2 && m < MAX)
    ...

...

printf("%lf %lf\n", x[4], y[1]);

我得到了

0.070850 0.000000

这是你的dat文件的第五行(不是第四行,数组索引从0开始,而不是1)。

至于你的另一个问题:

我担心你必须编写自己的排序功能。

答案 1 :(得分:1)

首先尝试:

double a;
int b;

...

fscanf(file, "%f %d", &a, &b)

您将ab初始化为double类型,但您正在从copy.dat文件中读取整数(%d)。 b是一个int值,因此请在%d中保留fscanf并更改初始化。

答案 2 :(得分:1)

您可以使用xy声明一个结构,以便将这两个值绑定在一起,xy将在交换数组元素时保持它们的关系在排序期间。例如:

struct data_t
{
    double x;
    int y;
};

int compare(const void *a, const void *b)
{
    const struct data_t *m = a;
    const struct data_t *n = b;
    if(m->x == n->x)
        return m->y > n->y;
    return m->x > n->x;
}

int main(void) 
{
    struct data_t data[MAX];
    FILE* file = fopen("Temp.dat", "r");
    int count = 0;
    while(fscanf(file, "%lf %d", &data[count].x, &data[count].y) == 2)
    {
        count++;
        if (count == MAX)
            break;
    }

    qsort(data, count, sizeof(struct data_t), compare);
    for(int i = 0; i < count; i++)
        printf("%lf %d\n", data[i].x, data[i].y);
    return 0;
}

使用%lf表示double值,或使用%f表示float,如其他答案所示

关于比较功能,假设您在数据中包含以下值:

0.060493 1
0.060493 5
0.060493 2

在这种情况下,第一个元素的x值与另一个元素的x值相同。如果您只测试m->x > n->x,则不会进行排序。因此,如果m->y > n->y相同,您希望比较x

qsort是标准的C函数。它不知道您的数据类型,我们必须告诉它有关数据类型的信息。这是在比较函数内完成的,它接收指针ab,我们知道它们是指向data数组中元素的指针,因此转换背后的原因

数据集最多可包含200项,因为我们将其struct data_t data[MAX];声明为MAX,其中200double arr[MAX + 1][8]

<小时/> 编辑3 ****** 使用数组,声明数组:

0

请注意,数组的第一个索引是从MAXarr[8][MAX + 1]的行。它以这种方式设置,以便稍后进行排序。现在我们可以直接将文件读入数组,并对数组进行排序(不需要结构)。请确保您不要将其与具有int compare_2d_array(const void *pa, const void *pb) { double a = *(double*)pa; double b = *(double*)pb; return a > b; } int main(void) { //array with MAX + 1 rows, and 8 columns, initialized to zero double arr[MAX + 1][8] = { 0 }; FILE* file = fopen("temp.dat", "r"); int count = 0; while(fscanf(file, "%lf %lf", &arr[count][0], &arr[count][1]) == 2) { count++; if(count == MAX) break; } qsort(arr, count, sizeof(arr[0]), compare_2d_array); //arr[0] and arr[1] are ready, now set up the other columns: for(int i = 0; i < count; i++) { //make modifications to other columns arr[i][2] = i ? arr[i - 1][0] : 0; arr[i][3] = arr[i][0]; arr[i + 1][4] = i + 1; printf("%.6lf %.0lf %.6lf %.6lf %.0lf\n", arr[i][0], arr[i][1], arr[i][2], arr[i][3], arr[i][4]); } return 0; }

的旧解决方案混淆
crawler/Publisher

search/Collection