#include<stdio.h>
void main()
{
FILE *a[10];
int i,j,k;
float b[10][4][4];
for(i=0;i<8;i++)
{
char filename[100];
sprintf(filename,"infile%d.txt",i);
a[i]=fopen(filename,"r");
}
for(i=0;i<8;i++)
{
for(j=0;j<2;j++)
{
for (k=0;k<3;k++)
{
fscanf(a[i],"%f",&b[i][j][k]);
}
}
}
for (i=0;i<8;i++)
{
printf("n-----------------%d--------------------",i);
for(j=0;j<2;j++)
{
for(k=0;k<3;k++)
{
printf("nb[%d][%d][%d]=%f",i,j,k,b[i][j][k]);
}
}
}
}
我已经用 C 编写了上面的代码。它只读取 8 个不同的文件并将其打印在终端中。文件名为 infile0、infile1 和子 on 到 infile7。尽管代码运行,但它会显示在终端中转储的分段故障核心。我完全想不通为什么会这样。有人可以帮助我找出代码中的错误吗?
当不存在文件时,使用 -g 编译并运行 valgrind 会给出错误行 19。
也许你应该添加
if(!a[i])continue;
在扫描之前。(并设置一些消息或默认值)。
另请查看使用 scanf() 进行输入验证,因为您应该检查 scanf 返回值。
我希望它有所帮助,这是我的第一个贡献。
编辑: -g 标志用于编译器,例如
gcc -g myfile.c -o myfile
然后运行你的二进制槽瓦尔格林德。
它会告诉你内存的任何问题:泄漏,无效的红色/写入...
valgrind ./myfile
不要忘记安装 valgrind 如果它不在您的系统上。
可以从你的代码中完成很多注释
1) 在
void main()
main返回一个int,而不是void,所以必须是
int main()
2) 在
FILE *a[10]; .. for(i=0;i<8;i++) { ... a[i]=fopen(filename,"r");
为什么你有一个包含 10 个条目的数组只使用其中的 8 个?,最好有
FILE *a[8];
3)10
(变成8)在你的代码中被多次使用,如果你决定改变元素的数量,你将不得不在每个地方改变它,使用#define
或sizeof(a)/sizeof(a[0])
更简单4) 在
char filename[100]; sprintf(filename,"infile%d.txt",i);
您对所需的大小非常慷慨,即使您的int在 64b 中,并且您增加了a中的条目数量(无论如何都没有更改以有足够的堆栈或文件描述)20 位数字足以获得正数,所以char filename[20+10+1];
就足够
了5) 在
float b[10][4][4]; ... for(j=0;j<2;j++) { for (k=0;k<3;k++)
喜欢 2) 如果您不使用所有条目,则没有理由使用如此大的数组
6) 在
fscanf(a[i],"%f",&b[i][j][k]);
您不检查相应的文件是否已打开,因此如果
a[i]
不是 NULL,则可能是因为文件未打开而导致分段错误您没有检测到文件的末尾,如果文件不包含有效的浮点数,则需要执行例如
if (fscanf(a[i],"%f",&b[i][j][k]) != 1) { ...error management... }