【问题标题】:How to read different types of data from file如何从文件中读取不同类型的数据
【发布时间】:2017-10-19 11:19:11
【问题描述】:

我有一个包含字符串、整数和双精度的文本文件。像这样:

亚瑟 10 14.5

朱莉娅 14 15.5

我需要将此数据读取到 3 个单独的数组中。 C 没有字符串数组,所以我需要 char 数组、int 数组和 double 数组。我的代码:

const int num = 18; //number of data.txt lines
char col_one[15];
int col_two;
double col_three;
int c;
int numberArray[num];
char *nameArray[num];
double doubleArray[num];
int size = 0;
FILE *file;
file = fopen("data.txt", "r");
if (file) {
    while ((c = getc(file)) != EOF)
    {
        fscanf(file, "%s %d %lf", &col_one, &col_two, &col_three);
        nameArray[size] = col_one;
        numberArray[size] = col_two;
        doubleArray[size] = col_three;
        size++;
    }
    fclose(file);
}


for (int i = 0; i < num; i++)
{
    printf("%s \n" ,nameArray[i]);
}

但我的代码只读取第一个单词并打印 18 次。如何读取字符串变量并将其放入 char 数组中?

【问题讨论】:

  • 尝试检查fscanf的返回值
  • while ((c = getc(file)) != EOF) { fscanf(file, "%s %d %lf", &amp;col_one, &amp;col_two, &amp;col_three); nameArray[size] = col_one; -- > while (fscanf(file, "%14s %d %lf", col_one, &amp;col_two, &amp;col_three)==3 &amp;&amp; size &lt; num){ nameArray[size] = strdup(col_one);
  • 还有i &lt; num; --> i &lt; size;
  • 缺少:if (size &gt;= num) break;

标签: c arrays


【解决方案1】:

nameArray[size] = col_one;

您使nameArray所有 元素指向同一个位置。这意味着看起来所有字符串都是相同的(并且等于您读取的最后一个字符串)。

对此有几种不同的解决方案,但我推荐的一种是对数据使用 结构,然后为该结构使用单个数组。然后直接读入结构本身,不使用临时变量或指针数组。

可能是这样的:

struct data
{
    char name[15];
    int int_value;
    double float_value;
};

struct data data_array[num];

...

while (fscanf(file, "%14s, %d %lf", data_array[size].name,
                                    &data_array[size].int_value,
                                    &data_array[size].float_value) == 3)
{
    ++size;
}

使用上面的代码,您还解决了另一个问题,即读取并丢弃文件的第一个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2021-09-20
    • 2021-03-08
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多