簡體   English   中英

讀取文本文件並對兩個數組進行排序

[英]Reading text file and sorting two arrays

我有一個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每一行Temp.dat和讀取兩個double-type整數,然后被存儲在兩個陣列x[MAX]和`Y [MAX]。 因此,有人可以幫助我解決此問題嗎?

另一個問題:將上面的兩列存儲在兩個數組x[MAX]y[MAX] ,我想根據第一個數組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

如何在C中執行此sorting例程,因為很難將y[MAX]的元素排列為遵循x[MAX]中其對應元素的順序?

首先在while條件中添加&& m < MAX ,以免緩沖區溢出。

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)。

至於您的其他問題:

恐怕您必須編寫自己的排序函數。

對於初學者,請嘗試:

double a;
int b;

...

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

您將ab初始化為雙精度類型,但是您正在從copy.dat文件中讀取整數( %d )。 b是一個int值,因此將%d保留在fscanf並更改初始化。

您可以使用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 float值,或將%f用作float

關於比較功能,假設您的數據中包含以下值:

0.060493 1
0.060493 5
0.060493 2

在這種情況下, x從第一元素的值是相同的x與其它元件值。 如果僅測試m->x > n->x則不會發生排序。 因此,如果x相同, m->y > n->y比較m->y > n->y

qsort是標准的C函數。 它不知道您的數據類型,我們必須告訴它有關數據類型的信息。 這是在compare函數內部完成的,該函數接收指針ab ,我們知道它們是指向data數組中元素的指針,因此這就是轉換的原因。

數據集最多可以包含200項目,因為我們將其聲明為struct data_t data[MAX]; 其中MAX200


編輯3 ******
使用數組,聲明數組:

double arr[MAX + 1][8]

請注意,數組的第一個索引是從0MAX行。 它是以這種方式設置的,因此可以在以后進行排序。 現在,我們可以將文件直接讀取到數組中,並對數組進行排序(無需結構)。 確保不要將其與具有arr[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; } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM