【问题标题】:Storing values from file to struct array in C在C中将值从文件存储到结构数组
【发布时间】:2019-06-19 15:47:11
【问题描述】:

我正在尝试从我的文本文件中读取值并将它们存储在结构数组中。我的文本文件有这些值:

names.txt

Num_of_rec: 5
3 7 10 1 red
5 6 8 2 red
9 9 16 5 blue
13 4 19 2 green
12 8 15 4 blue

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ERROR -1
#define MAXLEN 256

struct Point {
    float x;
    float y;
};

struct Rectangle {
    struct Point top_left;
    struct Point bottom_right;
    char color[7];
};


int main() {
    int i, N;
    char junk[MAXLEN];
    struct Rectangle *data;
    FILE  *fp;

    fp = fopen("names.txt", "r");

    fscanf(fp,"%s %d\n",junk,&N);
    printf("No: %d", N);

    data = (struct Rectangle *) malloc(N*sizeof(struct Rectangle));

    for(i=0; i<N; i++) {
        fscanf(fp, "%lf %lf %lf %lf %s", data[i].top_left.x, data[i].top_left.y, data[i].bottom_right.x, data[i].bottom_right.y);
    }

    return 0;
}

我想将所有这些值添加到结构数组(数据)中,但我不知道如何正确执行此操作。到现在为止的输出是:

No: 5

然后它就崩溃了。我不明白问题是我用来从文件中读取值并将它们存储到结构数组或其他东西的方法。

【问题讨论】:

  • 对于 float 类型,格式说明符应该是 %f 而不是 %lf 所以你可能会破坏某些东西,因为你只提供了 4 字节的位置,而不是预期的 8 字节的位置。
  • 您在fscanf() 的参数中缺少data[i].color
  • 在你的编译器中开启完整的警告,它应该警告你这两个问题。
  • fscanf() 的所有其他参数之前,您需要&amp;,例如&amp;data[i].top_left.x.
  • 非常努力地发帖A Minimal, Complete, and Verifiable Example (MCVE)。他们是如此之少,与新成员相距甚远,看到一个令人耳目一新。您应该在使用文件指针之前验证fp != NULL,并且在考虑数据有效之前还应该验证每个fscanf 返回。

标签: c arrays data-structures struct


【解决方案1】:
fscanf(fp, "%lf %lf %lf %lf %s", data[i].top_left.x, data[i].top_left.y, data[i].bottom_right.x, data[i].bottom_right.y);

fscanf存在三个问题:

  1. fscanf 接受指针,你传入值
  2. fscanf 需要 5 个指针,您只提供 4 个值。
  3. 格式说明符 %lf 需要一个指向 double 类型的指针

将上述语句更改为以下语句应该可以解决崩溃问题。

fscanf(fp, "%f %f %f %f %s", &data[i].top_left.x, &data[i].top_left.y, &data[i].bottom_right.x, &data[i].bottom_right.y, data[i].color);

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多