fprintf()为什么不起作用?

时间:2022-12-05 19:58:07
想修改文件中的数据,但是执行了下面的程序后(其他程序没有问题)文件中所要修改的部分并没有改变,不知道是为什么?

此文件的打开方式是“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

19 个解决方案

#1


读写转换时,加一句
fseek(pFile , 0 , SEEK_CUR);

#2


其实我觉得更好的方法是另外写一个文件,然后写完后删除原来文件并重命名
你这样做的危险在于:1。文件指针定位是不是如你想象的那么准确我很怀疑 2。 如果你操作一半失败了,你的输入文件也被破坏了

#3


//写文件
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]

#4


按1L的办法试试

#5


引用 1 楼 mstlq 的回复:
读写转换时,加一句
fseek(pFile , 0 , SEEK_CUR);

+1

#6


fseek(pFile , 0 , SEEK_CUR);

究竟有什么用处,看似是没用啊?   不懂!!!

#7


变量 line 的定义是什么,长度是多少, 你确定 (!strcmp(line , "efine")) == 1 时也写不进去么?
是不是在取"efine"时,存储的不正确,导致判断条件不成立才写不进去的阿?
另外 fscanf 读字符串后,文件内部指针如何移动,是在读出的字符串的结尾处还是在其后的空格处?
不管 fscanf 后指针在那个地方,也需要将其重定位到 efine 的开始处,或下一个 Define 的开始处吧!

#8


引用 1 楼 mstlq 的回复:
读写转换时,加一句
fseek(pFile , 0 , SEEK_CUR);


试了一下,加了这句以后程序无法弹出运行后的程序窗口,不知道这是为什么呢?

#9


引用 7 楼 yanfeiouc2009 的回复:
变量 line 的定义是什么,长度是多少, 你确定 (!strcmp(line , "efine")) == 1 时也写不进去么?
是不是在取"efine"时,存储的不正确,导致判断条件不成立才写不进去的阿?
另外 fscanf 读字符串后,文件内部指针如何移动,是在读出的字符串的结尾处还是在其后的空格处?
不管 fscanf 后指针在那个地方,也需要将其重定位到 efine 的开始处,或下……


这些都用断点试过了,没有问题~~

#10


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,有点奇怪,有点无聊

#11


r+ 方式下无法用fprintf往文件里写入东西,又怎么能替代呢?

#12


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.

#13


帮顶。

#14


r+可以的,不过你要先读然后再写,我这个加载程序就是先读进数据然后再定的。

#15


你要在运行之后关闭掉运行窗口再去看文件

#16


前几天我问过类似的问题,用"r+"、 "w+" 或者 "a+" 打开文件的时候都会出现这样的问题
解决方法是在读和写之间加上一句:
fseek(fp,0,1);

见这个帖子:
http://topic.csdn.net/u/20100630/02/06d092db-28c3-48bc-8be2-bdb32dbbf707.html

#17


引用 2 楼 arong1234 的回复:
其实我觉得更好的方法是另外写一个文件,然后写完后删除原来文件并重命名
你这样做的危险在于:1。文件指针定位是不是如你想象的那么准确我很怀疑 2。 如果你操作一半失败了,你的输入文件也被破坏了



很好很强大的说

#18


通过对比调试,我发现有feof(pFile);时不能正确写入,把这个去掉后就可以了,这是为什么呢??

#19


对文件的操作我还不行,我是个新手,路过留个脚印。呼呼!

#1


读写转换时,加一句
fseek(pFile , 0 , SEEK_CUR);

#2


其实我觉得更好的方法是另外写一个文件,然后写完后删除原来文件并重命名
你这样做的危险在于:1。文件指针定位是不是如你想象的那么准确我很怀疑 2。 如果你操作一半失败了,你的输入文件也被破坏了

#3


//写文件
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]

#4


按1L的办法试试

#5


引用 1 楼 mstlq 的回复:
读写转换时,加一句
fseek(pFile , 0 , SEEK_CUR);

+1

#6


fseek(pFile , 0 , SEEK_CUR);

究竟有什么用处,看似是没用啊?   不懂!!!

#7


变量 line 的定义是什么,长度是多少, 你确定 (!strcmp(line , "efine")) == 1 时也写不进去么?
是不是在取"efine"时,存储的不正确,导致判断条件不成立才写不进去的阿?
另外 fscanf 读字符串后,文件内部指针如何移动,是在读出的字符串的结尾处还是在其后的空格处?
不管 fscanf 后指针在那个地方,也需要将其重定位到 efine 的开始处,或下一个 Define 的开始处吧!

#8


引用 1 楼 mstlq 的回复:
读写转换时,加一句
fseek(pFile , 0 , SEEK_CUR);


试了一下,加了这句以后程序无法弹出运行后的程序窗口,不知道这是为什么呢?

#9


引用 7 楼 yanfeiouc2009 的回复:
变量 line 的定义是什么,长度是多少, 你确定 (!strcmp(line , "efine")) == 1 时也写不进去么?
是不是在取"efine"时,存储的不正确,导致判断条件不成立才写不进去的阿?
另外 fscanf 读字符串后,文件内部指针如何移动,是在读出的字符串的结尾处还是在其后的空格处?
不管 fscanf 后指针在那个地方,也需要将其重定位到 efine 的开始处,或下……


这些都用断点试过了,没有问题~~

#10


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,有点奇怪,有点无聊

#11


r+ 方式下无法用fprintf往文件里写入东西,又怎么能替代呢?

#12


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.

#13


帮顶。

#14


r+可以的,不过你要先读然后再写,我这个加载程序就是先读进数据然后再定的。

#15


你要在运行之后关闭掉运行窗口再去看文件

#16


前几天我问过类似的问题,用"r+"、 "w+" 或者 "a+" 打开文件的时候都会出现这样的问题
解决方法是在读和写之间加上一句:
fseek(fp,0,1);

见这个帖子:
http://topic.csdn.net/u/20100630/02/06d092db-28c3-48bc-8be2-bdb32dbbf707.html

#17


引用 2 楼 arong1234 的回复:
其实我觉得更好的方法是另外写一个文件,然后写完后删除原来文件并重命名
你这样做的危险在于:1。文件指针定位是不是如你想象的那么准确我很怀疑 2。 如果你操作一半失败了,你的输入文件也被破坏了



很好很强大的说

#18


通过对比调试,我发现有feof(pFile);时不能正确写入,把这个去掉后就可以了,这是为什么呢??

#19


对文件的操作我还不行,我是个新手,路过留个脚印。呼呼!

#20