2009-12-27 53 views
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); 
    } 

正如你看到的,我在这里更换新线(例如线如上图所示)。 我想插入文本并保留新行,而不是我在上面做的。

+0

向我们展示一些代码和您面临的问题。你说什么是非常可能的。然而,缺乏适当的背景并不能帮助我们帮助你。 – dirkgently 2009-12-27 13:58:06

+0

为什么需要演员? “newbuff”和“o_rec_buff”的类型是什么使它们成为必要的?除非必要,否则你应该放弃施放,而且为什么他们需要这个问题还很不明显。此外,“if(feof(nptr))”测试是来自Pascal的输入。你应该测试'fgets()'的返回值。还要注意,如果fgets()调用失败,那么缓冲区的内容是不确定的 - 这意味着你不能依赖它包含任何理智的东西。 (它可能会和失败之前的一样,但是你不能依赖它。) – 2009-12-27 16:58:24

回答

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_bufnewbuff不是char *

1

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