使用带stdout的fseek

时间:2014-08-15 15:49:43

标签: c

当文件指针arg是stdout时,是否可以使用fseek?

我在尝试覆盖最后一个""的情况下尝试过它。在逗号分隔的列表中使用")"

e.g。

fprintf(stdout, "1,2,3,4,");

fseek(stdout, -1, SEEK_CUR);

fprintf(stdout, ")");

实现:

1,2,3,4)

而不是

1,2,3,4,)

不幸的是我输出了后者

2 个答案:

答案 0 :(得分:5)

当且仅当 fseek引用可搜索流时,您才能在stdout 上成功使用stdout

如果您的程序的标准输出要转到终端或类似的东西(通常是默认设置)或管道,那么fseek将失败。如果由于您在重定向其输出的情况下执行了该程序而进入某个文件,则fseek可以像处理任何其他文件一样工作。

每次调用fseek时,都应检查其返回值,看是否成功或失败。

假设 stdout可以寻找可能是不好的做法,因为它通常是一个不好的假设。

fseek或打印'\b'都不是您尝试做的好方法。如果您还没有打印列表中的最后一项,则应该打印逗号 ,而不是打印最后一个逗号然后尝试删除它。检测到这一点可能非常重要。

答案 1 :(得分:2)

无法在fseek上使用stdout。相反,您可以使用退格符'\b'将光标移回一个空格:

fprintf(stdout, "1,2,3,4,");

fprintf(stdout, "\b)");

注意:如果stdout指向终端,并且已重定向到文件或管道,则此有效。此外,如果光标当前位于一行的开头,则不能保证其正常工作。一般情况下,只有少数几种情况可以使用。