读书人

这两个函数有什么不一样?解决方案

发布时间: 2012-03-09 16:54:57 作者: rapoo

这两个函数有什么不一样?
in.dat中存有100行10列数据,每行均为0或1

char xx[100][11]

int ReadDat(void)
{FILE *fp;
int i;
char tt[13];
if((fp=fopen( "in.dat ", "r " ))==NULL) return 1;
for(i=0;i <100;i++){
if(fgets(tt,13,fp)==NULL)return 1;
memcpy(xx[i],tt,10);
xx[i][10]=0;
}
fclose(fp);
return 0;
}

int ReadDat(void)
{
FILE *fp;
int i;
if((fp=fopen( "IN.DAT ", "r ")) == NULL) return 1;
for(i=0;i <100;i++)
{
if(fgets(xx[i],11,fp)==NULL)return 1;

xx[i][10]= '\0 ';
}
fclose(fp);
return 0;
}


[解决办法]
我发现有两个主要区别:
1) 文件名不一样,一个为全大写的 "IN.DAT ",另一个为全小写的“in.data”,在Linux下这是两个不同的文件。
2) 对于fgets()调用的处理不一样,因为fgets把换行符也作为有效的字符,所以当一行有10个字符时,实际上它将需要11(在Linux平台上换行符为 "\n ")或者12个字符(Window平台上换行符为 "\r\n "),加上字符串结束符实际上最多需要13个字节的缓冲区。

所以前者可以得到你想要的结果,而后者很可能得到类似如下的结果
0000000000
\r
\n
0000000001
\r
\n
0000000010
...

读书人网 >C语言

热点推荐