2 aaronmorgan aaronmorgan 于 2015.06.03 22:00 提问

关于fseek,fscanf,fprintf的问题
c

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);

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

3个回答

gamefinity
gamefinity   Rxr 2015.06.04 06:02
  • 其实你现在这样的写法也是有问题的。只不过因为你只写了个位数所以不觉得。
  • 如果你在输出的时候写成%3d的话,那么tmp文件里的内容是 1 2 3 4 5 6 7 8 9 10,每个数之间有空格,所以读的时候不会出错,
  • 如果你在输出的时候写成%d的话,那么tmp文件里的内容是12345678910,中间没有空格
  • 然后你再去读的时候,i=0的时候会读到12345678910;显然这个数都超出了int的范围,所以会报错
  • 你现在的程序,写一个3位数进去。读出来的时候一样会有问题。
nswcfd
nswcfd 正解
2 年多之前 回复
gamefinity
gamefinity 回复aaronmorgan: 没有啊,还是占了11个字节啊,但是scanf读的时候可不是一个一个字节给你的,它是判断到空格、tab、回车或者你指定的分隔符才把前面一段一起给你。你没有空格的话,它认为全部是一起的了
2 年多之前 回复
aaronmorgan
aaronmorgan fseek中的偏移量是以字节为单位的,我将这些数写进文件后为什么一个数只占一字节12345678910,只有11字节。这是为什么呢
2 年多之前 回复
aaronmorgan
aaronmorgan   2015.06.05 08:02

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

q3733353520
q3733353520 你写进文件存储后就不存在什么字节的问题了
2 年多之前 回复
datou431
datou431   Rxr 2015.06.18 11:01

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

Csdn user default icon
上传中...
上传图片
插入图片