我有一个文件指针,我正在使用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);
}
正如您所看到的,我在此处替换新行(示例行如上所示)。 我想插入文本并保留新行而不是我上面所做的。
答案 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。
最后,为什么所有演员? fgets
和o_rec_buf
不属于newbuff
类型吗?
答案 1 :(得分:1)
如果缓冲区有足够的空间,则需要使用memmove进一步移动预告片1并更新所需的字符。 确保你不要忘记记住尾随的'\ 0'。