在C中将多个文本文件读入数组

时间:2015-05-09 07:57:32

标签: c arrays text-files

我正在编写一个打开大量文本文件的程序,并从中读取行星体的参数。我在阅读文本文件时遇到问题。

示例文本文件

 2
 1, 1, 2
 3.5, 3, 4

第一个数字(2)指的是文件中找到的实体数量。接下来的2行对应于行星的参数(分别为x和y坐标和质量)。我有4个包含不同数量的主体的文本文件,需要将所有数据存储在变量中。

我的代码

struct body {

float x;
float y;
float mass;

};

int main()
{

struct body b[8];
FILE *fp;
int i, j, k;
int num, count = 0;
char fName[10];

for (i = 1; i < 5; i++)    
{ 
    sprintf(fName,"bodies%d.txt",i);
    fp = fopen(fName, "r");

    if (fp == NULL)
    {   
        printf("Can't open %s \n",fName);
        exit(-1);
    }

    fscanf(fp, "%d", &num);


    for (j = count; j < num; j++)
    {               
        fscanf(fp, "%f%*c %f%*c %f%*c", &b[j].x, &b[j].y, &b[j].mass);
        printf("%f %f %f\n", b[j].x, b[j].y, b[j].mass);

        count = j;
    }               


}

正在读取文本文件中的数字,但是在6次读数后停止,总共有8个。

可能是什么问题?

2 个答案:

答案 0 :(得分:1)

尝试在第二个j = count循环中将j = 0替换为for

答案 1 :(得分:1)

您的代码存在一些问题

  1. fName被声明为

    char fName[10];
    

    你使用

    sprintf(fName,"bodies%d.txt",i);
    

    将12个字符写入fName(包括NUL终结符),最多可以容纳9个字符(NUL终止符为+1)。

  2. for循环:

    for (j = count; j < num; j++)
    {               
        fscanf(fp, "%f%*c %f%*c %f%*c", &b[j].x, &b[j].y, &b[j].mass);
        printf("%f %f %f\n", b[j].x, b[j].y, b[j].mass);
    
        count = j;
    }
    

    有很多问题,也很困惑。执行j = count后,请检查j < num。这没有任何意义,因为countnum无关。

  3. <强>修复

    1. 对于第一个问题,请为fName分配足够的空间:

      char fName[12];
      

      而不是

      char fName[10];
      
    2. 关于第二个问题,请使用

      for (j = 0; j < num; j++) //j should be initialized to 0
      {               
          fscanf(fp, "%f%*c %f%*c %f%*c", &b[count].x, &b[count].y, &b[count].mass);
          printf("%f %f %f\n", b[count].x, b[count].y, b[count].mass); //Use b[count] instead of b[j]
      
          //count = j; Works, but the below is better
          count++;
      }