我正在编写一个打开大量文本文件的程序,并从中读取行星体的参数。我在阅读文本文件时遇到问题。
示例文本文件
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个。
可能是什么问题?
答案 0 :(得分:1)
尝试在第二个j = count
循环中将j = 0
替换为for
。
答案 1 :(得分:1)
您的代码存在一些问题:
fName
被声明为
char fName[10];
你使用
sprintf(fName,"bodies%d.txt",i);
将12个字符写入fName
(包括NUL终结符),最多可以容纳9个字符(NUL终止符为+1)。
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
。这没有任何意义,因为count
与num
无关。
<强>修复强>:
对于第一个问题,请为fName
分配足够的空间:
char fName[12];
而不是
char fName[10];
关于第二个问题,请使用
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++;
}