我想打印一个很大的矩阵列表中的数据。它不适合终端(80行),因此使用标准打印功能进行打印很不方便;并且less
已经被发明了,所以我不想使用ncurses来重新发明它;所以我想传递一些printf
D行到less
。
我的第一个猜测是先写入文件,然后写入system("less -S file");
,然后删除该文件。
一个更复杂的解决方案是减少重写,以便将其main()
转换为less()
我可以从C调用的函数,而不是文件名字符串,我可以为其提供文件描述符或流。
有没有什么方法不需要创建文件,也不需要重写(少部分)?
您可以考虑使用POSIX函数popen()
和pclose()
。
您将使用:
FILE *fp = popen("less", "w");
if (fp != NULL)
{
…write output to fp…
pclose(fp);
}
else
…report error…
请注意,pclose()
将等待less
退出。如果需要,可以捕获pclose()
并分析返回值。请参阅之后如何检测shell是否无法执行命令popen()
?对此进行讨论。
对于以后阅读此问题的人:
| less
这段代码中的shell几乎没有什么区别。显然,“您不能使用Ctrl + C来停止跳到输出的末尾,而又不会杀死更少的程序和原始程序”。来源:从C程序插入寻呼机(较少)。这可能是问题,也可能不是问题。使用
q
代替Control-C(或任何中断键)从退出less
。你可以考虑增加信号处理到您的程序,但它是不平凡得到正确的-你可能最终模拟popen()
和pclose()
,而不是使用它们。其实这对我来说不是问题,但是在阅读了您的答案之后,我用Google搜索了一下,发现了区别。据我了解,关闭不是问题
less
,而是停止正在执行的操作。摘自man less
:“通常,中断字符可以减少停止执行任何操作并返回其命令提示符的可能性。” 。但是,我以前从未使用过该命令。就我的用法而言,这popen()
是完美的。我想,正如您所说,在程序中捕获信号并将中断字符传递到流中可以解决该问题。