【问题标题】:How to read from file and save in to array in C programing?如何在 C 编程中从文件中读取并保存到数组中?
【发布时间】:2015-08-12 05:46:00
【问题描述】:

我正在尝试从包含多行数字和字符串的文件中读取数据并将其保存到数组中。但是,当我调用存储在该数组中的值的元素时,我得到了不正确的结果。

例如,如果我有一个包含

的文本文件
1:Smith:John:3;43
2:Saget:Bob:5:55
3:Wayne:Bruce:7:21

我正在尝试将数组中第一行的对象存储在s[0] 中,第二行存储在s[1] 中,第三行存储在s[3] 中。

这是我的struct SalesPerson

struct SalesPerson {
    int salesNum; // 4-digit integer
    char lastName[31]; // salesperson's last name
    char firstName[31]; // salesperson's first name
    int salesRate; // commission level for each salesperson
    double salesAmount; //amount the salesperson committed for the week   
};

这是我的主要功能

#include <stdio.h>
#include <stdlib.h>
#include "sales.h"
#define SIZE 1000

int main()
{
    struct SalesPerson s[SIZE];

    //opening the file for reading
    FILE * openRead(char salesinfo[]);
    {
        FILE *fp;
        fp = fopen("salesinfo.txt", "r");

        int i;

        if(fp != NULL){

            //read from the file and save it to array s
            for (i=0;i<SIZE;i++){
                while(!feof(fp)){
                    fscanf(fp, "%d:%[^:]:%[^:]:%d:%lf\n" ,&s[i].salesNum,     s[i].lastName, s[i].firstName, &s[i].salesRate, &s[i].salesAmount);
                }
            }
            fclose(fp);
        }
        else
            printf("ERROR! Cannot open the file!\n");
    }
}

如果我这样做

printf("%d\n", s[i].salesRate);

我得到了salesRate 的所有结果。

3
5
7

但是,当我尝试printf

printf("%d\n", s[1].salesRate);

我没有给我5,而是得到了错误的结果。有人可以告诉我哪里出错了吗?我的 for 循环条件不正确吗?

【问题讨论】:

  • 你能提供你的整个主要功能吗?你只给出了一半的程序......
  • 对不起,我现在包含了我的整个主要功能
  • 请参阅while (!feof(file)) is always wrong,了解您的循环为何出错。 TL;DR — 测试fscanf() 的结果;不要使用feof()
  • struct SalesPerson 是什么?它可以包含char *lastName 吗?
  • @SergeBallesta struct SalesPerson 有 5 条信息,我正在阅读的文本已经拥有。我试图创建一个存储这 5 条信息的数组。我会在上面的问题中发布我的结构。

标签: c arrays file structure


【解决方案1】:

你有多余的缩进;在声明未使用的openRead() 函数或相应的} 之后,您真的不需要{

您已更新数据以匹配代码,这对 ilent2 不完全公平,其 answer 最初相关但不再相关。

您在阅读循环中遇到了主要问题——其中一个问题是有两个嵌套循环:

for (i=0;i<SIZE;i++){
    while(!feof(fp)){
        fscanf(fp, "%d:%[^:]:%[^:]:%d:%lf\n", &s[i].salesNum, s[i].lastName, s[i].firstName, &s[i].salesRate, &s[i].salesAmount);
    }
}

您的内部循环受到while (!feof(file)) is always wrong 的影响。此外,您向 EOF 读取 i == 0,随后的读取都立即失败。 (这与您声称的结果无关:我不清楚您在这里做了什么。)您应该测试fscanf() 是否读取了正确数量的值。所以,你需要一个循环,它应该看起来更像:

for (i = 0; i < SIZE; i++)
{
    if (fscanf(fp, "%d:%[^:]:%[^:]:%d:%lf\n", &s[i].salesNum, s[i].lastName,
               s[i].firstName, &s[i].salesRate, &s[i].salesAmount) != 5)
        break;
}

【讨论】:

  • 这解决了我的问题。谢谢
【解决方案2】:

如果您的文件有类似1;Smith;John;3;43 的条目,您的fscanf(fp, "%d:%[^:]:%[^:]:%d:%lf\n" 应该包含; 而不是:。不知道这是否是你唯一的问题,但这是我第一个跳出来的问题。

你可能需要也可能不需要最后的\n,因为(从记忆中)scanf 有时会丢弃空格(我会找到一个链接)。

【讨论】:

  • 自给出这个(原本正确的)答案以来,样本数据已经更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多