在一行内插入文本

时间:2009-12-27 13:48:14

标签: c fgets file-handling

我有一个文件指针,我正在使用fgets()给我一个完整的行以及缓冲区中的新行。 我想替换1个字符并在新行之前添加另一个字符。那可能吗? 例如:

buffer is "12345;\n"
output buffer is "12345xy\n"

这是代码:

buff = fgets((char *)newbuff, IO_BufferSize , IO_handle[i_inx]->fp);
nptr = IO_handle[i_inx]->fp;
if(feof(nptr))
    {
            memcpy((char *)o_rec_buf+(strlen((char *)newbuff)-1),"E",1);
    }
    else
    {
            memcpy((char *)o_rec_buf+(strlen((char *)newbuff)-1),"R",1);
    }

正如您所看到的,我在此处替换新行(示例行如上所示)。 我想插入文本并保留新行而不是我上面所做的。

2 个答案:

答案 0 :(得分:3)

您无法以您希望的方式插入一个字符。如果您确定o_rec_buf有足够的空间,并且该行始终以";\n"结尾,那么您可以执行以下操作:

size_t n = strlen(newbuff);
if (n >= 2)
    strcpy(o_rec_buf + n - 1, "E\n");
    /* memcpy(o_rec_buf+n-1, "E\n", 3); works too */

请注意,像您一样使用feof()大多数情况下都是错误。 feof()告诉您是否在之后命中文件上的文件结束条件。如果您在循环中运行上述代码,当feof()返回'true'时,fgets将不会读取任何行,buff将会NULL,但{ {1}}将保持不变。换句话说,newbuff将包含上次newbuff来电的数据。您将处理最后一行两次。有关详情和解决方案,请参阅CLC FAQ 12.2

最后,为什么所有演员? fgetso_rec_buf不属于newbuff类型吗?

答案 1 :(得分:1)

如果缓冲区有足够的空间,则需要使用memmove进一步移动预告片1并更新所需的字符。 确保你不要忘记记住尾随的'\ 0'。