Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在一行内插入文本_C_Fgets_File Handling - Fatal编程技术网

C 在一行内插入文本

C 在一行内插入文本,c,fgets,file-handling,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))

我有一个用于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);
    }
正如您所看到的,我在这里替换新行(上面显示了示例行)。
我想插入文本并保留新行,而不是我在上面所做的操作。

如果缓冲区有足够的空间,您需要使用memmove进一步移动拖车1个字符,并更新所需的字符。
确保不要忘记memmove尾部的“\0”。

如果缓冲区有足够的空间,则需要使用memmove进一步移动尾部的1个字符,并更新所需的字符。
请确保不要忘记移动尾随的“\0”。

不能按所需方式插入一个字符。如果您确定
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
调用的数据。您将处理最后一行两次。有关详细信息和解决方案,请参阅


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

您不能按所需方式插入一个字符。如果您确定
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
调用的数据。您将处理最后一行两次。有关详细信息和解决方案,请参阅


最后,为什么所有演员都是演员?
o_rec_buf
newbuff
是否属于
char*
类型?

向我们展示一些代码和您面临的问题。你说的很有可能。然而,缺乏适当的背景并不能帮助我们帮助你。为什么需要演员阵容?什么类型的
newbuff
o_rec_buff
使它们成为必需的?除非有必要,否则你应该避免使用强制类型转换,而且为什么需要它们还很不明显。另外,“
if(feof(nptr))
”测试是从Pascal think导入的。您应该从
fgets()
测试返回值。另外请注意,如果
fgets()
调用失败,则缓冲区的内容是未定义的-这意味着您不能依赖它包含任何正常的内容。(这可能与失败调用之前的情况相同,但您不能相信它是如此。)向我们展示一些代码和您面临的问题。你说的很有可能。然而,缺乏适当的背景并不能帮助我们帮助你。为什么需要演员阵容?什么类型的
newbuff
o_rec_buff
使它们成为必需的?除非有必要,否则你应该避免使用强制类型转换,而且为什么需要它们还很不明显。另外,“
if(feof(nptr))
”测试是从Pascal think导入的。您应该从
fgets()
测试返回值。另外请注意,如果
fgets()
调用失败,则缓冲区的内容是未定义的-这意味着您不能依赖它包含任何正常的内容。(这可能与失败调用之前的情况相同,但您不能指望会是这样。)