首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件编辑出错。如何编辑文件?

文件编辑出错。如何编辑文件?
EN

Stack Overflow用户
提问于 2022-01-03 19:43:48
回答 3查看 68关注 0票数 0
代码语言:javascript
复制
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字母出现时,我都想用#来修改它,其他的保持不变。但是当我运行这个代码程序时。我做错什么了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-03 19:55:10

  1. char c,一定是int c
  2. while(!feof(o)) -读Andreas的评论
代码语言:javascript
复制
while((c = fgetc(o)) != EOF)

读取将文件指针向前移动一个char,因此您需要将它移回到前面的位置。

例如

代码语言:javascript
复制
fseek(o, -1L, SEEK_CUR);
票数 1
EN

Stack Overflow用户

发布于 2022-01-03 19:54:16

"r+"更新模式下打开文件时,可以同时打开文件进行读写。

然而,这并不意味着你可以自由地在读写之间切换。根据第7.21.5.3国际标准化组织C11标准第7段的说法,有一些限制:

  • 如果没有对fflush或文件定位函数(fseekfsetposrewind)的中间调用,输出就不能跟着输入。
  • 如果没有对文件定位函数的中间调用,则输入后不能输出,除非输入操作遇到文件结束。

在发布的代码中,您违反了这两条规则,这会导致程序调用未定义行为。这意味着任何事情都可能发生,包括你的I/O函数读或写胡说八道的可能性。

另外,您的程序还有另一个bug。线

代码语言:javascript
复制
while(!feof(o)){

没有任何意义。请参阅以下问题的原因:

为什么“while( !feof (file) )”总是错误的?

另外,您应该始终使用fclose关闭文件,否则,根据您的平台,可能不会刷新输出缓冲区。

下面是一个修复上面描述的所有bug的程序:

代码语言:javascript
复制
#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;
}
票数 1
EN

Stack Overflow用户

发布于 2022-01-03 19:55:11

在您的帖子中,您的if语句中有一个会写到文件中的you子句,但是您不想这样做。您已经在r+中打开了该文件,并且文件的内容不会被截断。因此,为了达到您想要的效果,您只需扫描每个字符,一旦您阅读了您要查找的字符(在本例中为'h' ),您将需要将文件指针1字符向后移动。你可以用fseek(o, -1L, SEEK_CUR);做这件事。然后执行fputc(),用'#'覆盖文件中的该字符。

代码语言:javascript
复制
#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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70570675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档