#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,其子级最多为infile7。尽管代码运行了,但显示了终端中转储的分段故障核心。我完全不知道为什么会这样。有人可以帮我找出代码中的错误吗?
答案 0 :(得分:3)
使用-g编译并运行槽valgrind会在没有文件的情况下显示错误行19。
也许您应该添加
if(!a[i])continue;
在scanf之前。 (并设置一些消息或默认值)。
还请查看Input validation using scanf(),因为您应该检查scanf返回值。
我希望这会有所帮助,这是我的第一个贡献。
编辑: -g标志适用于您的编译器,例如
gcc -g myfile.c -o myfile
然后运行您的二进制槽valgrind。
它会告诉您任何内存问题:泄漏,无效的红色/写入...
valgrind ./myfile
如果不在您的系统中,请不要忘记安装valgrind。
答案 1 :(得分:1)
您的代码可以做很多注释
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)在您的代码中使用了很多次,如果您决定更改元素的数量,则必须在每个位置进行更改,使用{ {1}}或#define
4)在
sizeof(a)/sizeof(a[0])
您非常需要所需的大小,甚至您的 int 都在64b中,并且您增加了 a 中的条目数量(无需更改即可拥有足够的堆栈)还是文件说明)20个数字足以表示一个正数,所以char filename[100];
sprintf(filename,"infile%d.txt",i);
就足够了
5)在
char filename[20+10+1];
就像2)如果不使用所有条目,则没有理由使用如此大的数组
6)在
float b[10][4][4]; ... for(j=0;j<2;j++) { for (k=0;k<3;k++)
您不会检查相应文件是否已打开,因此如果 fscanf(a[i],"%f",&b[i][j][k]);
不为NULL,则可能是由于文件未打开而导致的分段错误
您不会检测到文件结尾,或者如果文件不包含有效的浮动,则需要执行例如a[i]