读取文件并在struct

时间:2017-07-15 16:06:06

标签: c file struct

我正在尝试编写一个读取文件的程序,将数据存储在struct数组中,计算卷并写入按卷分类的新文件。程序编译并写入新文件,但不是按体积排序,重量为每个重量打印0.000000。

编辑:一切正常,除了按量排序

#include <stdio.h>
#define PI 3.14159265

struct cylinder {
    double radius;
    double height;
    double weight;
    double volume;
};

void selection_sort(struct cylinder my_cylinders[], int n);

int main() {
    FILE *cFileIn, *cFileOut;
    double radius, height, weight, volume;

    struct cylinder my_cylinders[100];

    cFileIn = fopen("cylinders.txt", "r");
    if (cFileIn == NULL) {
        printf("Error opening file \n");
        return 1;
    }

    cFileOut = fopen("sorted_cylinders.txt", "w");
    if (cFileOut == NULL) {
        printf("Error opening file \n");
        return 1;
    }

    fprintf(cFileOut, "#    Radius           Height          Volume          Weight\n");

    int i, counter = 0;
    for (i = 0; i < 6; i++) {   
        while (fscanf(cFileIn, "%lf, %lf, %lf, %lf\n", &radius, &height, &volume, &weight) != EOF) {
            my_cylinders[counter].radius = radius;
            my_cylinders[counter].height = height;
            my_cylinders[counter].volume = volume;
            my_cylinders[counter].weight = weight;

            volume = PI * radius * radius * height; 
            fprintf(cFileOut, "%-d\t  %-12.6lf\t  %-12.6lf\t  %-12.6lf\t   %-12.6lf\t \n", 
                    counter, radius, height, volume, weight);
            counter++;      
        }
    }

    selection_sort(my_cylinders, counter);
    printf("File sorted_cylinders.txt written \n");

    fclose(cFileIn);
    fclose(cFileOut);
    return 0;
}

void selection_sort(struct cylinder my_cylinders[], int n) {
    int i = 0, j = 0, min;
    struct cylinder temp;
    for (i = 0; i < n - 1; ++i) {
        min = i;
        for (j = i + 1; j < n; ++j) {
            if (my_cylinders[j].volume < my_cylinders[min].volume) {
                min = j;
            }
        }
        temp = my_cylinders[i];
        my_cylinders[i] = my_cylinders[min];
        my_cylinders[min] = temp;
    }   
}

输出:

#    Radius           Height          Volume          Weight
0     2.400000        12.000000       217.146884       15.000000    
1     18.200000       14.200000       14776.820321     25.900000    
2     22.800000       10.600000       17311.130546     4.500000     
3     3.500000        2.500000        96.211275        15.800000    
4     6.000000        1.000000        113.097335       2.900000     
5     21.000000       1.000000        1385.442359      100.000000   

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题:

  • 为什么你有2个嵌套循环来读取文件?

  • 如果文件中有超过100个条目,您可以阅读超出数组末尾的内容。

  • 您应该测试Collections.shuffle(yourArrayListName); 的返回值是预期转化次数,而不是与fscanf()不同。如果文件中存在无效输入,EOF将继续fscanf(),而不是0

  • 您不应该从输入文件中读取音量,因为它不存在。

  • 您应该使用更精确的PI值:遗憾的是EOF并不总是在M_PI中定义,因为C标准并没有强制要求它。使用此:

    <math.h>
  • 选择排序中的算法存在缺陷。使用#define M_PI 3.14159265358979323846 和比较功能。

  • 在排序数据之前编写输出文件。

以下是修改后的版本:

qsort