【问题标题】:How do I store data from a file in a function in an array and then print that array?如何将文件中的数据存储在数组中的函数中,然后打印该数组?
【发布时间】:2016-04-13 06:28:08
【问题描述】:

目前我的代码如下所示:

#include<stdio.h>

#define MAX_SIZE 12

int readInventory(char filename[], int item[], float price[]);


int main(void)
{
    int item[MAX_SIZE], i;
    float price[MAX_SIZE];
    char filename[MAX_SIZE];
    for ( i = 0; i < MAX_SIZE; i++ )
    {
      readInventory(filename, &item[i], &price[i]);
      printf("\n%d %.2f\n", item[i], price[i]);
    }
    return 0;
}


int readInventory(char filename[], int item[], float price[])
{

    FILE *inventory;
    int i;

    inventory = fopen("inventory.dat", "r");


    for ( i = 0; i < MAX_SIZE; i++ )
    {
      fscanf(inventory,"%d%f", &item[i], &price[i]);         
      return 1;
    }
    fclose(inventory);
    return 0;
}

打印出来的:

1200 20.00

1200 20.00

1200 20.00

1200 20.00

1200 20.00

1200 20.00

1200 20.00

1200 20.00

1200 20.00

1200 20.00

1200 20.00

1200 20.00

这只是文件中的前两项

如何让我的程序显示所有 12 个不同的项目?

【问题讨论】:

  • 从函数for循环中删除return 1
  • 看看你阅读的那个循环,记住return从函数立即返回。
  • 并决定你想要循环的位置 - 在 readInventory 函数中或外部,但不是在两个地方。
  • 你需要检查fopen和fscanf返回的结果。

标签: c arrays file-management read-write


【解决方案1】:

在代码中包含 return 1 语句会立即从 for 循环返回。删除它,它应该可以工作。

#include<stdio.h>

#define MAX_SIZE 12

int readInventory(char filename[], int item[], float price[]);


int main(void)
{
    int item[MAX_SIZE], i;
    float price[MAX_SIZE];
    char filename[MAX_SIZE];
    for ( i = 0; i < MAX_SIZE; i++ )
    {
      readInventory(filename, &item[i], &price[i]);
      printf("\n%d %.2f\n", item[i], price[i]);
    }
    return 0;
}


int readInventory(char filename[], int item[], float price[])
{

    FILE *inventory;
    int i;

    inventory = fopen("inventory.dat", "r");


    for ( i = 0; i < MAX_SIZE; i++ )
    {
      fscanf(inventory,"%d%f", &item[i], &price[i]);         
    }
    fclose(inventory);
    return 0;
}

【讨论】:

  • for循环中不需要readInventory()调用,会反复无用。
【解决方案2】:
#include<stdio.h>

#define MAX_SIZE 12

int readInventory(char filename[], int item[], float price[]);

int main(void)
{
    int item[MAX_SIZE], i, err = 0;
    float price[MAX_SIZE];
    char filename[MAX_SIZE] = "data";

    if ((err = readInventory(filename, item, price)) != 0) {
        return err;
    }

    for (i = 0; i < MAX_SIZE; i++)
        printf("%d: %d %.2f\n",i+1, item[i], price[i]);

    return 0;
}

int readInventory(char filename[], int item[], float price[])
{
    FILE *inventory = NULL;
    int i;

    if ((inventory = fopen(filename, "r")) == NULL) {
        fprintf(stderr, "Failed to open %s\n", filename);
        return (1);
    }

    for (i = 0; i < MAX_SIZE; i++)
        fscanf(inventory, "%d%f", &item[i], &price[i]);

    fclose(inventory);
    return 0;
}

你可以试试这个。查看传递数组的区别,对函数调用进行错误检查。代码缩进。

【讨论】:

  • 谢谢,这解释清楚了!唯一的区别是如果函数无法打开文件并且在 main 中执行了错误 printf 语句,我返回 1
【解决方案3】:

在您的代码中进行以下更改,它将起作用, 去掉for循环中的readInventory(),调用一次就可以了。

为了打印,在 fscanf 之后的 readInventory() for 循环中放置一个 printf() 并从那里删除 return 1 语句。

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多