如何在**C中替换行中的字符串**

如何在**C中替换行中的字符串**,c,C,在C编程中,我想搜索一个文件(见下文),检查一个特定的字符串(一个特定的逻辑块)并替换该逻辑块中的一些位。 我可以搜索字符串/行并将其替换为新字符串但是,我想在文件中搜索一个字符串,并用另一个字符串替换行数/列数之后的一些字符串。例如,我想将第7行的前5个字符(00010)替换为.io\u tile 1 0之后。 有人能告诉我怎么做吗 .comment arachne-pnr 0.1+328+2 (git sha1 c40fb22, g++ 5.4.0-6ubuntu1~16.04.12 -O2

在C编程中,我想搜索一个文件(见下文),检查一个特定的字符串(一个特定的逻辑块)并替换该逻辑块中的一些位。 我可以搜索字符串/行并将其替换为新字符串但是,我想在文件中搜索一个字符串,并用另一个字符串替换行数/列数之后的一些字符串。例如,我想将第7行的前5个字符(00010)替换为.io\u tile 1 0之后。 有人能告诉我怎么做吗

.comment arachne-pnr 0.1+328+2 (git sha1 c40fb22, g++ 5.4.0-6ubuntu1~16.04.12 -O2)
.device 1k
.io_tile 1 0
000000000000000000
000000000000000000
000000000000000000
000000000000000000
000000000000000000
000000000000000000
000100000000000000
000000000000000000
000000000000000000
000100000000000000
000000000000000000
000000000000000000
000000000000000000
000000000000000000
000000000000000000
000000000000000000
.io_tile 2 0
000000000000000000
000000000000000000
000000000000000000
000000000000000000

第一个问题是,前后字符串的大小是否相等?如果没有,则需要在替换之前重写整个文件(如果正在增长)

第二,在这么多行之后,只意味着在开始搜索之前阅读N行。行建议使用文件*而不是int fd,因此:

int i ;
char buf[4096];

if ( NULL == freopen( "your file", "r", stdin )){
    perror( "open 'your file'" );
    exit( 1 );
}


for ( i = N ; i > 0 ; i-- ){
    if ( NULL == fgets( buf, sizeof( buf ), stdin )){
        perror( "read 'your file'" );
        exit( 1 );
    }

    if ( NULL == strchr( buf, '\n' ){
        fprintf( stderr, "Line too long, make a bigger buffer!\n" );
        exit( 1 );
    }
}
在行首搜索字符串是一个简单的memcmp()(不需要空终止符)。在一行中的任意位置查找字符串是strstr()。替换大小相等的字符串是memcpy()或memmove()(不需要/写入空终止符)(仅当重叠是一个问题时才需要memmove()),fseek()返回经过写入点读取的数据(我记得fseek()有一个相对模式),fwrite()或fputs()从写入点返回缓冲区,至少直到修改为止。如果要多次执行此操作,则需要在恢复fgets()循环之前使用fseek()重置文件位置。扩展字段需要先重写文件以向上滑动数据,然后查找回写入点并写入新字段。缩小字段需要重写文件的其余部分以向下滑动数据


您可以使用malloc()制作的缓冲区,使用realloc(),例如2x,并在旧数据之后读取,来扩展缓冲区。

感谢@David的响应。是的,更换前后尺寸相同。我只想在FPGA位流中搜索一些特定的位,然后翻转它们。文件的实际大小保持不变。我曾经为文件中的任意字符串编写了一个char字符串替换。当然,如果文件有校验和,那将是一个问题。我用它把一个众所周知的可执行文件中活板门的默认密码更改为不太可能或不可能输入的密码,还有其他有趣的事情!memcmp()的循环和匹配memcpy()的循环。