c - 在一行内插入文本

标签 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);
    }

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

最佳答案

您不能按照您想要的方式插入一个字符。如果您确定 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”时,fgetsbuff 将不会读取任何行> 将为 NULL,但 newbuff 将保持不变。换句话说,newbuff 将包含来自上次 fgets 调用的数据。您将处理最后一行两次。参见 CLC FAQ 12.2了解更多信息和解决方案。

最后,为什么所有类型转换? o_rec_bufnewbuff 不是 char * 类型吗?

关于c - 在一行内插入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1965982/

相关文章:

c++ - std::ifstream/FILE* 可以改变大小吗?

c# - 从C#运行C代码

c - 为什么 fgets() 和 strncmp() 在此 C 代码中无法用于字符串比较?

linux - 如何用shell中的一个符号替换一个或多个连续的符号

java - 递归堆栈不保存 HashMap 中的更改

c - 由于 C 中的 40 MB 数组而导致段错误 11

c - 为什么 Splint(C 代码检查器)在将 float 与 int 进行比较时会出错?

C - fgets() - 换行符的长度

c - 为具有空终止字符的 fgets 分配内存字符串

arrays - Swift - 将文件读入字符串数组