int main() {
FILE* o = fopen("o.txt","r+");
char c;
while(!feof(o)){
c = fgetc(o);
if(c == 'h'){
fputc('#',o);
}else {
fputc(c,o);
}
}
return 0;
}这是代码,我试着编辑文本文件,每当h字母出现时,我都想用#来修改它,其他的保持不变。但是当我运行这个代码程序时。我做错什么了。
发布于 2022-01-03 19:55:10
char c,一定是int cwhile(!feof(o)) -读Andreas的评论while((c = fgetc(o)) != EOF)读取将文件指针向前移动一个char,因此您需要将它移回到前面的位置。
例如
fseek(o, -1L, SEEK_CUR);发布于 2022-01-03 19:54:16
在"r+"更新模式下打开文件时,可以同时打开文件进行读写。
然而,这并不意味着你可以自由地在读写之间切换。根据第7.21.5.3国际标准化组织C11标准第7段的说法,有一些限制:
fflush或文件定位函数(fseek、fsetpos或rewind)的中间调用,输出就不能跟着输入。在发布的代码中,您违反了这两条规则,这会导致程序调用未定义行为。这意味着任何事情都可能发生,包括你的I/O函数读或写胡说八道的可能性。
另外,您的程序还有另一个bug。线
while(!feof(o)){没有任何意义。请参阅以下问题的原因:
为什么“while( !feof (file) )”总是错误的?
另外,您应该始终使用fclose关闭文件,否则,根据您的平台,可能不会刷新输出缓冲区。
下面是一个修复上面描述的所有bug的程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
//attempt to open file
fp = fopen( "o.txt", "r+" );
if ( fp == NULL )
{
fprintf( stderr, "error opening file!\n" );
exit( EXIT_FAILURE );
}
for (;;) //infinite loop, equivalent to while(1)
{
long prev_pos;
int c;
//remember previous file position, so that we can jump
//back to it for writing, if necessary
prev_pos = ftell( fp );
//attempt to read next character
c = fgetc( fp );
//break infinite loop if end-of-file (or error) encountered
if ( c == EOF )
break;
//replace character, if appropriate
if ( c == 'h' )
{
//jump back to previous position
fseek( fp, prev_pos, SEEK_SET );
//write replacement character
fputc( '#', fp );
//flush the stream
fflush( fp );
}
}
//close the file
fclose( fp );
return 0;
}发布于 2022-01-03 19:55:11
在您的帖子中,您的if语句中有一个会写到文件中的you子句,但是您不想这样做。您已经在r+中打开了该文件,并且文件的内容不会被截断。因此,为了达到您想要的效果,您只需扫描每个字符,一旦您阅读了您要查找的字符(在本例中为'h' ),您将需要将文件指针1字符向后移动。你可以用fseek(o, -1L, SEEK_CUR);做这件事。然后执行fputc(),用'#'覆盖文件中的该字符。
#include <stdio.h>
#include <string.h>
int main() {
FILE* o = fopen("o.txt","r+");
int c;
while((c = fgetc(o)) != EOF) {
if(c == 'h'){
fseek(o, -1L, SEEK_CUR);
fputc('#',o);
}
}
return 0;
}o.txt以前:aaaahaaaa
o.txt后:aaaa#aaaa
https://stackoverflow.com/questions/70570675
复制相似问题