C语言fopen(),哪里出错了呢?
#include<stdio.h>#defineFINITY5000#defineM20typedefstruct{charvexs[M];intedges[M][M];...
#include <stdio.h>
#define FINITY 5000
#define M 20
typedef struct{
char vexs[M];
int edges[M][M];
int n,e;
} Mgraph;
void creat(Mgraph *g,char *s,int c)
{
int i,j,k,w;
FILE *rf=NULL;
rf=fopen(s,"r");
if(rf)
{
fscanf(rf,"%d%d",&g->n,&g->e);
for(i=0;i<g->n;i++)
fscanf(rf,"%ls",&g->vexs[i]);
for(i=0;i<g->n;i++)
for(j=0;j<g->n;j++)
{
if(i==j)
g->edges[i][j]=0;
else
g->edges[i][j]=FINITY;
}
for(k=0;k<g->e;k++)
{
fscanf(rf,"%d%d%d",&i,&j,&w);
g->edges[i][j]=w;
if(c==0)
{
g->edges[j][i]=w;
}
}
fclose(rf);
}
else
g->n=0;
}
int main()
{
Mgraph g;
creat(&g,"C:\\c_work\\OSPF\\a.txt",1);
printf("%d-%d\n",g.n,g.e);
int i=0;
for(i=0;i<g.n;i++)
printf("%c",g.vexs[i]);
getchar();
return 0;
}
这是个从文件里面读矩阵,并且输出矩阵信息的小程序,编译通过,但是运行就立即出错停止,不知道哪儿出问题,求帮帮忙。。。谢谢大家。。
文件的内容是这样的
6 6
012345
0 2 4
0 3 28
第一行是结点数和边数,第二行是结点编号,第三四行是相连结点和它的权值。。。 展开
#define FINITY 5000
#define M 20
typedef struct{
char vexs[M];
int edges[M][M];
int n,e;
} Mgraph;
void creat(Mgraph *g,char *s,int c)
{
int i,j,k,w;
FILE *rf=NULL;
rf=fopen(s,"r");
if(rf)
{
fscanf(rf,"%d%d",&g->n,&g->e);
for(i=0;i<g->n;i++)
fscanf(rf,"%ls",&g->vexs[i]);
for(i=0;i<g->n;i++)
for(j=0;j<g->n;j++)
{
if(i==j)
g->edges[i][j]=0;
else
g->edges[i][j]=FINITY;
}
for(k=0;k<g->e;k++)
{
fscanf(rf,"%d%d%d",&i,&j,&w);
g->edges[i][j]=w;
if(c==0)
{
g->edges[j][i]=w;
}
}
fclose(rf);
}
else
g->n=0;
}
int main()
{
Mgraph g;
creat(&g,"C:\\c_work\\OSPF\\a.txt",1);
printf("%d-%d\n",g.n,g.e);
int i=0;
for(i=0;i<g.n;i++)
printf("%c",g.vexs[i]);
getchar();
return 0;
}
这是个从文件里面读矩阵,并且输出矩阵信息的小程序,编译通过,但是运行就立即出错停止,不知道哪儿出问题,求帮帮忙。。。谢谢大家。。
文件的内容是这样的
6 6
012345
0 2 4
0 3 28
第一行是结点数和边数,第二行是结点编号,第三四行是相连结点和它的权值。。。 展开
3个回答
展开全部
fopen 没问题。
数据文件a.txt 必须存为 ASCII 文件,不要用 unicode 或其他。
fscanf(rf,"%ls",&g->vexs[i]); 里面格式要用 %1s, 注意是数字1,不是字母l.
后面可以添一个字符串结束符号: g->vexs[g->n]='\0';
这样输出打印便可简单地用 printf("%s",g.vexs);
数据文件a.txt 必须存为 ASCII 文件,不要用 unicode 或其他。
fscanf(rf,"%ls",&g->vexs[i]); 里面格式要用 %1s, 注意是数字1,不是字母l.
后面可以添一个字符串结束符号: g->vexs[g->n]='\0';
这样输出打印便可简单地用 printf("%s",g.vexs);
追问
追答
发生错误时的情况下,很难说出理由。只能理解为内存残余信息。
在我的win-7 上,输出是 0-0。
展开全部
g->edges[i][j]=w;这一句有问题。从文件中读出来的数赋给i和j,而这数已使数组edges越界了,你可以在g->edges[i][j]=w前输出i和j验证,也可以把M改定义为30证实……
追问
哪里有越界啊,i<节点数,j<节点数啊,怎么会越界。。。这是个二维数组啊。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
跟一下程序看看错在哪里
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询