0

我有一个文件指针,我将它与 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);
    }

如您所见,我在这里替换了新行(示例行如上所示)。我想插入文本并保留新行,而不是我在上面所做的。

4

2 回答 2

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,但newbuff不会改变。换句话说,newbuff将包含上次fgets调用的数据。您将处理最后一行两次。有关更多信息和解决方案,请参阅CLC FAQ 12.2

最后,为什么所有的演员表?是o_rec_buf不是newbuff类型char *

于 2009-12-27T14:34:09.613 回答
1

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

于 2009-12-27T13:52:13.533 回答