0

我在尝试将数字从文件传递到结构时遇到问题。

我正在尝试读取的文件具有以下格式:

1002 January 287.4
1002 February 22.3
1002 March 51.4

到目前为止,这是我的代码。

#include <stdio.h>
#include <stdlib.h>

struct RainData{

    int stationID;
    float yearTotal;

};

int main(){

    int n, i, x;
    struct RainData *dataPtr;

    FILE *fptr;
    fptr = fopen("rain.dat","r");

    if (fptr == NULL){

        printf("Error in opening file\n");

        return 1;

    }

    fscanf(fptr, "%d", &n);
    dataPtr = (struct RainData *) malloc(n * sizeof(struct RainData));

    for (i = 0; i < n; i++){

        for (x = 0; x < 12; x++)

            fscanf(fptr, "%d" "%f", &(*dataPtr).stationID[i], &(*dataPtr).yearTotal[i]);

    }

    fclose(fptr);
    free(dataPtr);

    return 0;

}

当我运行它时,我得到一个分段错误错误。我很确定我的错误出在 malloc 上,但我终其一生都无法弄清楚。我不确定如何使用 malloc 将变量转换为数组。我也知道 fscanf 中缺少“%s”。这个问题不使用月份,所以我想尽可能避免分配一个无用的变量来包含它。

提前致谢!

4

1 回答 1

0

有几个问题。首先,正如@mbratch 指出的那样,dataPtr 是一个结构数组,因此您必须使用正确的下标来引用它,然后使用“。” 指其成员。其次,您的文件包含格式为“%d %s %f”的行,因此您还需要更新 fscanf。第三,您需要在顶部添加总行数,因为您正在从中读取 n 的值。最后,不确定为什么 x 从 0 变为 12 - 你可以删除它。

试试这个主要代码:

int n, i, x;
struct RainData *dataPtr;
FILE *fptr;
char temp_str[100];

fptr = fopen("rain.dat","r");
if (fptr == NULL){
    printf("Error in opening file\n");
    return 1;
}

fscanf(fptr, "%d", &n);
dataPtr = (struct RainData *) malloc(n * sizeof(struct RainData));
printf("n is %d\n", n);

for (i = 0; i < n; i++){
    fscanf(fptr, "%d %s %f", &dataPtr[i].stationID, temp_str, &dataPtr[i].yearTotal);
}
for (i = 0; i < n; i++){
    printf("%d \t %f\n", dataPtr[i].stationID, dataPtr[i].yearTotal);
}

fclose(fptr);
free(dataPtr);
return 0;

有了这个 rain.dat 文件:

3
1002 January 287.4
1002 February 22.3
1002 March 51.4
于 2013-09-04T00:19:47.650 回答