我的fwrite为什么最后一条记录老也写不进去?100分。

shantian 2004-03-23 09:36:13

fp=fopen("test.dat","rb+")
fpos_t pos = 0;

for(int i=0;i<10;i++)
{
pos = 100*i;
if( fsetpos( fp, &pos ) != 0 )
{
return FALSE;
}
fwrite(&iStore,sizeof(int),1,fp);
}

我发现,最后写入:也就是I=9的数据其实没写入.当I=0的时候,根本没写入,I=1的时候,0的时候写如了,1没写入,也就是最后的不写入.不知道为什么?
前提,我表里有数据,想更改某个位上的数据.

那位指点一下.
...全文
177 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
shantian 2004-03-23
  • 打赏
  • 举报
回复
100是纪录的长度(100字节)
wshcdr 2004-03-23
  • 打赏
  • 举报
回复
在循环里
打开文件
fwrite数据后
再关闭

试试看
lbaby 2004-03-23
  • 打赏
  • 举报
回复
有可能出现在fsetpos上

你的pos = 100*i;
这个100是从哪里来的?
xiaoguoru 2004-03-23
  • 打赏
  • 举报
回复
有两种方法:一种是将你打开的文件设置成不缓冲用这个函数setbuf(FILE *f//你打开的文件变量,NULL//设置成NULL表示写文件不用缓冲);
第二种:用fflush()函数!
shantian 2004-03-23
  • 打赏
  • 举报
回复
fsetpos,我用来移动位置的。如加上FFLUSH()函数后,又出现新问题。
假设文件中有5个需要更改的(根据某个字段来判断),我第一次更该了一个,同时这个字段设置为以更改,下次是1个,当我更改到剩两个的时候,更改了一个,也提示还剩一个,但是,我再次运行,则提示为0个了。不知道为什么?

说明,文件里的数据按照某个结构来存储。

谢谢大家。
lbaby 2004-03-23
  • 打赏
  • 举报
回复
或者测试一下fwrite的返回值,看是不是你想写入的字节数,
再一个
不知你fsetpos是干什么用的,
在写的时候,自己移动文件指针,就有可能出错
lbaby 2004-03-23
  • 打赏
  • 举报
回复
在fclose之前加一个
fflush(fp)试试
wythust 2004-03-23
  • 打赏
  • 举报
回复
还在不在啊,能不能给个完整的程序啊
happystudy 2004-03-23
  • 打赏
  • 举报
回复
类似这样的问题我也遇到过,我的是根据键盘输入,来决定以后操作的程序,发现getch(),必须连续使用两次才用用,可能是第一次的操作没有执行吧,原因我到现在我也没明白,你的情况和我的一样,应该和流有关。
shantian 2004-03-23
  • 打赏
  • 举报
回复
各位能指点下吗?
shantian 2004-03-23
  • 打赏
  • 举报
回复
特别感谢 lbaby(阳光下对着天使竖起中指) !!!
结分。
本人的解决的方法是用了fflush()函数。
谢谢大家。
lbaby 2004-03-23
  • 打赏
  • 举报
回复
上边
fseek(fp,(i-1)*sizeof(st),SEEK_SET);
应为:
fseek(fp,i*sizeof(st),SEEK_SET);
lbaby 2004-03-23
  • 打赏
  • 举报
回复
不好意思,错了,是 t2用来产生数据,t3t读出,t2t改写数据,
F:\ot\Debug>t2

F:\ot\Debug>t3t
0 : i=0,j=1,chg=0
1 : i=1,j=2,chg=0
2 : i=2,j=3,chg=0
3 : i=3,j=4,chg=0
4 : i=4,j=5,chg=0
5 : i=5,j=6,chg=0
6 : i=6,j=7,chg=0
7 : i=7,j=8,chg=0
8 : i=8,j=9,chg=0
9 : i=9,j=10,chg=0

F:\ot\Debug>t2t

F:\ot\Debug>t3t
0 : i=0,j=1,chg=0
1 : i=1,j=2,chg=0
2 : i=2,j=3,chg=0
3 : i=3,j=4,chg=0
4 : i=4,j=5,chg=0
5 : i=10,j=25,chg=1
6 : i=12,j=36,chg=1
7 : i=14,j=49,chg=1
8 : i=16,j=64,chg=1
9 : i=18,j=81,chg=1
看看是不是你的
lbaby 2004-03-23
  • 打赏
  • 举报
回复
结果(t2t用来产生数据,t3t用来读出数据,t2用来改变数据):
F:\ot\Debug>t2t

F:\ot\Debug>t3t
0 : i=0,j=1,chg=0
1 : i=1,j=2,chg=0
2 : i=2,j=3,chg=0
3 : i=3,j=4,chg=0
4 : i=10,j=50,chg=1
5 : i=10,j=25,chg=1
6 : i=12,j=36,chg=1
7 : i=14,j=49,chg=1
8 : i=16,j=64,chg=1
9 : i=18,j=81,chg=1

F:\ot\Debug>t2

F:\ot\Debug>t3t
0 : i=0,j=1,chg=0
1 : i=1,j=2,chg=0
2 : i=2,j=3,chg=0
3 : i=3,j=4,chg=0
4 : i=4,j=5,chg=0
5 : i=5,j=6,chg=0
6 : i=6,j=7,chg=0
7 : i=7,j=8,chg=0
8 : i=8,j=9,chg=0
9 : i=9,j=10,chg=0

F:\ot\Debug>t2t

F:\ot\Debug>t3t
0 : i=0,j=1,chg=0
1 : i=1,j=2,chg=0
2 : i=2,j=3,chg=0
3 : i=3,j=4,chg=0
4 : i=4,j=5,chg=0
5 : i=10,j=25,chg=1
6 : i=12,j=36,chg=1
7 : i=14,j=49,chg=1
8 : i=16,j=64,chg=1
9 : i=18,j=81,chg=1

lbaby 2004-03-23
  • 打赏
  • 举报
回复
试了一下,可以的:
第一个程序t2.c用来产生数据:
#include <stdio.h>

typedef struct {
int i;
int j;
int chg;
} st;




int main(void)
{
FILE *fp;
st se;
int i;
fp=fopen("test.dat","wb");

if(!fp)
{
puts("can't open file");
exit(1);
}
for( i=0;i<10;i++)
{
se.i=i;
se.j=i+1;
se.chg=0;
if(sizeof(se) != fwrite(&se,1,sizeof(st),fp) )
{ break; }
}

if(i!=10)
{
puts("can not creat the file");
}
fclose(fp);

return 0;
}


第二个程序,用来读出数据:
#include <stdio.h>

typedef struct {
int i;
int j;
int chg;
} st;




int main(void)
{
FILE *fp;
st se;
int i;
fp=fopen("test.dat","rb");

if(!fp)
{
puts("can't open file");
exit(1);
}
for( i=0;i<10;i ++)
{
fread(&se,1,sizeof(st),fp);
printf("%d : i=%d,j=%d,chg=%d\n",i,se.i,se.j,se.chg);
}

fclose(fp);

return 0;
}


第三个程序,用来改变数据:

#include <stdio.h>

typedef struct {
int i;
int j;
int chg;
} st;




int main(void)
{
FILE *fp;
st se;
int i;
fp=fopen("test.dat","rb+");

if(!fp)
{
puts("can't open file");
exit(1);
}
for( i=5;i<10;i ++)
{
se.i=2*i;
se.j=2*i*i;
se.chg=1;
fseek(fp,(i-1)*sizeof(st),SEEK_SET);
fwrite(&se,1,sizeof(st),fp);
}

fclose(fp);

return 0;
}


junnyfeng 2004-03-23
  • 打赏
  • 举报
回复
我试过可以,或者你再检查下

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧