【问题标题】:insert text inside a line在一行内插入文本
【发布时间】:2009-12-27 13:48:13
【问题描述】:

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

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

【问题讨论】:

  • 向我们展示一些代码和您面临的问题。你说的很有可能。但是,缺乏适当的上下文不会帮助我们帮助您。
  • 为什么需要演员表? newbuffo_rec_buff 的类型是什么?你应该避免强制转换,除非它们是必要的,而且为什么需要它们远非显而易见。此外,'if (feof(nptr))' 测试是从 Pascal-think 导入的。您应该测试来自fgets() 的返回值。另请注意,如果fgets() 调用失败,则缓冲区的内容是未定义的——这意味着您不能依赖它包含任何理智的东西。 (它可能会和失败的调用之前一样,但你不能指望它是这样的。)

标签: c fgets file-handling


【解决方案1】:

您不能以您想要的方式插入一个字符。如果您确定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_bufnewbuff 不是 char * 类型吗?

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2015-11-12
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多