fprintf()为什么不起作用?

fba529635 2010-06-13 06:35:52
想修改文件中的数据,但是执行了下面的程序后(其他程序没有问题)文件中所要修改的部分并没有改变,不知道是为什么?

此文件的打开方式是“r+“,前面已经读进来了文件中的数据,现在想重新遍历文件并修改特定的数据,修改的程序如下:
//-----------------------------------------------------------------------------------------
//写文件
fseek(pFile , 0 , SEEK_SET);
while(!feof(pFile))
{
float ii = 9 , jj = 9 , kk = 9 ;
iChar = fgetc(pFile);
if(iChar == 'D')
{
fscanf(pFile , "%s" , line);
if(!strcmp(line , "efine"))
{
int n ;
n = fprintf(pFile , "efine %f %f %f\n" , ii , jj , kk);

}

}
else
fgets(line , 256 , pFile);
}

//----------------------------------------------

文件(为OBJ文件)的一部分为:
f 6387 6389 6844
f 6278 6790 6845
f 6389 6278 6845
Define 0.000000 1.000000 2.000000
Define 1.000000 2.000000 3.000000
Define 2.000000 3.000000 4.000000
...全文
1537 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbnjack 2010-07-04
  • 打赏
  • 举报
回复
对文件的操作我还不行,我是个新手,路过留个脚印。呼呼!
fba529635 2010-07-03
  • 打赏
  • 举报
回复
通过对比调试,我发现有feof(pFile);时不能正确写入,把这个去掉后就可以了,这是为什么呢??
linoon 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 arong1234 的回复:]
其实我觉得更好的方法是另外写一个文件,然后写完后删除原来文件并重命名
你这样做的危险在于:1。文件指针定位是不是如你想象的那么准确我很怀疑 2。 如果你操作一半失败了,你的输入文件也被破坏了
[/Quote]


很好很强大的说
snser 2010-07-02
  • 打赏
  • 举报
回复 1
前几天我问过类似的问题,用"r+"、 "w+" 或者 "a+" 打开文件的时候都会出现这样的问题
解决方法是在读和写之间加上一句:
fseek(fp,0,1);

见这个帖子:
http://topic.csdn.net/u/20100630/02/06d092db-28c3-48bc-8be2-bdb32dbbf707.html
why0727 2010-07-02
  • 打赏
  • 举报
回复
你要在运行之后关闭掉运行窗口再去看文件
fba529635 2010-07-02
  • 打赏
  • 举报
回复
r+可以的,不过你要先读然后再写,我这个加载程序就是先读进数据然后再定的。
giant1st 2010-06-21
  • 打赏
  • 举报
回复
r+ 方式下无法用fprintf往文件里写入东西,又怎么能替代呢?
giant1st 2010-06-21
  • 打赏
  • 举报
回复
0000000: 6620 3633 3837 2036 3338 3920 3638 3434 f 6387 6389 6844
0000010: 0d0a 6620 3632 3738 2036 3739 3020 3638 ..f 6278 6790 68
0000020: 3435 0d0a 6620 3633 3839 2036 3237 3820 45..f 6389 6278
0000030: 3638 3435 0d0a 4465 6669 6e65 2030 2e30 6845..Define 0.0
0000040: 3030 3030 3020 312e 3030 3030 3030 2032 00000 1.000000 2
0000050: 2e30 3030 3030 300d 0a0d 0a .000000...


换行的 od oa 竟然用fgets 只得到了 oa 和后面的 0,有点奇怪,有点无聊
ForestDB 2010-06-21
  • 打赏
  • 举报
回复
帮顶。
huanmie_09 2010-06-21
  • 打赏
  • 举报
回复
When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for "update"). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired.
fba529635 2010-06-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yanfeiouc2009 的回复:]
变量 line 的定义是什么,长度是多少, 你确定 (!strcmp(line , "efine")) == 1 时也写不进去么?
是不是在取"efine"时,存储的不正确,导致判断条件不成立才写不进去的阿?
另外 fscanf 读字符串后,文件内部指针如何移动,是在读出的字符串的结尾处还是在其后的空格处?
不管 fscanf 后指针在那个地方,也需要将其重定位到 efine 的开始处,或下……
[/Quote]

这些都用断点试过了,没有问题~~
fba529635 2010-06-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]
读写转换时,加一句
fseek(pFile , 0 , SEEK_CUR);
[/Quote]

试了一下,加了这句以后程序无法弹出运行后的程序窗口,不知道这是为什么呢?
yanfeiouc2009 2010-06-19
  • 打赏
  • 举报
回复
变量 line 的定义是什么,长度是多少, 你确定 (!strcmp(line , "efine")) == 1 时也写不进去么?
是不是在取"efine"时,存储的不正确,导致判断条件不成立才写不进去的阿?
另外 fscanf 读字符串后,文件内部指针如何移动,是在读出的字符串的结尾处还是在其后的空格处?
不管 fscanf 后指针在那个地方,也需要将其重定位到 efine 的开始处,或下一个 Define 的开始处吧!
giant1st 2010-06-19
  • 打赏
  • 举报
回复
fseek(pFile , 0 , SEEK_CUR);

究竟有什么用处,看似是没用啊? 不懂!!!
wing_0706 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]

读写转换时,加一句
fseek(pFile , 0 , SEEK_CUR);
[/Quote]
+1
东莞某某某 2010-06-13
  • 打赏
  • 举报
回复
按1L的办法试试
bobo364 2010-06-13
  • 打赏
  • 举报
回复
//写文件
fseek(pFile , 0 , SEEK_SET);//调整pfile的文件指针到头
while(!feof(pFile))
{
float ii = 9 , jj = 9 , kk = 9 ;
iChar = fgetc(pFile);//读取一个字符
if(iChar == 'D')//如果读到的字符为D
{
fscanf(pFile , "%s" , line);//将含D的串拷到line数组
if(!strcmp(line , "efine"))//line与efine不同
{
int n ;
n = fprintf(pFile , "efine %f %f %f\n" , ii , jj , kk);//向文件内写入efineiijjkk

}

}
else
fgets(line , 256 , pFile);
}

//----------------------------------------------
[code=C/C++]
还有fprintf的例子
#include <stdio.h>
#include <process.h>

FILE *stream;

int main( void )
{
int i = 10;
double fp = 1.5;
char s[] = "this is a string";
char c = '\n';

stream = fopen( "fprintf.out", "w" );
//fprintf( stream, "%s", s );
fprintf( stream, "%s%c", s, c );
fprintf( stream, "%d\n", i );
fprintf( stream, "%f\n", fp );
fclose( stream );
system( "type fprintf.out" );
system("pause");
return 0;
} [/code]
arong1234 2010-06-13
  • 打赏
  • 举报
回复
其实我觉得更好的方法是另外写一个文件,然后写完后删除原来文件并重命名
你这样做的危险在于:1。文件指针定位是不是如你想象的那么准确我很怀疑 2。 如果你操作一半失败了,你的输入文件也被破坏了
mstlq 2010-06-13
  • 打赏
  • 举报
回复
读写转换时,加一句
fseek(pFile , 0 , SEEK_CUR);

69,371

社区成员

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

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