关于fseek,fscanf,fprintf的问题

FILE * fp;int i,n;
if((fp=fopen("tmp","w+"))==NULL)
{
return;
}
for(i=1;i<=10;i++)
{
fprintf(fp,"%3d",i);//fprintf(fp,"%d",i);
}
//写入 1 2 3 4 5 6 7 8 9 10
for(i=0;i<10;i++)
{
fseek(fp,i*3L,SEEK_SET);//fseek(fp,i*1L,SEEK_SET);
fscanf(fp,"%d",&n);
printf("%3d",n);
}
printf("\n");
fclose(fp);

当把代码换成注释部分的时候,屏幕显示的数有问题,这是为什么。

  • 其实你现在这样的写法也是有问题的。只不过因为你只写了个位数所以不觉得。
  • 如果你在输出的时候写成%3d的话,那么tmp文件里的内容是 1 2 3 4 5 6 7 8 9 10,每个数之间有空格,所以读的时候不会出错,
  • 如果你在输出的时候写成%d的话,那么tmp文件里的内容是12345678910,中间没有空格
  • 然后你再去读的时候,i=0的时候会读到12345678910;显然这个数都超出了int的范围,所以会报错
  • 你现在的程序,写一个3位数进去。读出来的时候一样会有问题。

fseek中的偏移量是以字节为单位的,我将这些数写进文件后为什么一个数只占一字节12345678910,只有11字节。这是为什么呢

回车或者你指定的分隔符才把前面一段一起给你。你没有空格的话,它认为全部是一起的了回车或者你指定的分隔符才把前面一段一起给你。你没有空格的话,它认为全部是一起的了回车或者你指定的分隔符才把前面一段一起给你。你没有空格的话,它认为全部是一起的了