[英]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)
您將a
和b
初始化為雙精度類型,但是您正在從copy.dat文件中讀取整數( %d
)。 b
是一個int值,因此將%d
保留在fscanf
並更改初始化。
您可以使用x
和y
聲明一個結構,以便將兩個值綁定在一起,當在排序過程中交換數組元素時, x
和y
將保持它們的關系。 例:
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函數內部完成的,該函數接收指針a
和b
,我們知道它們是指向data
數組中元素的指針,因此這就是轉換的原因。
數據集最多可以包含200
項目,因為我們將其聲明為struct data_t data[MAX];
其中MAX
是200
。
double arr[MAX + 1][8]
請注意,數組的第一個索引是從0
到MAX
行。 它是以這種方式設置的,因此可以在以后進行排序。 現在,我們可以將文件直接讀取到數組中,並對數組進行排序(無需結構)。 確保不要將其與具有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.