如果我使用UIViewController
,是否有任何方法可以阅读我在stdout中打印的内容?
我看到了C language. Read from stdout(它使用了管道),但它不起作用:
viewForHeaderInSection
我也尝试使用文件描述符,但它都不起作用:
def __init__(self, coord=None):
coord = coord or rand_pos()
我该怎么办?
答案 0 :(得分:1)
通常不会,除非标准输出已重定向到文件。写入标准输出的函数(如printf()
)不会在您的进程中的任何位置记录它们的输出,并且无法从正常文件以外的任何内容读取您之前的输出*。例如,如果您的进程正在将其输出打印到终端,尝试从终端读取数据将返回用户输入的内容,而不是您之前输出的内容。
你的第二个程序几乎正在工作。但是,您需要首先解决一些小问题:
第一个printf()
的输出不会输出,因为它缺少换行符。添加新行,或者调用fflush(stdout)
以强制输出。
您正在尝试printf()
您的搜索结果,但标准输出仍然指向该文件,因此您永远不会看到它。覆盖标准输出后显示内容的最简单方法是使用fprintf(stderr, ...)
。
(*:或者某些行为很像文件,比如块设备或命名管道。但你可能不会使用这些。)
答案 1 :(得分:1)
如果stdout是一个文件,你可以打开另一个文件描述符并查找和阅读。如果它是管道,另一方面,你不能。写入管道的数据只能读取一次。如果该管道的读取端与tty相关联,则它将由设备驱动程序读取,并且不再可供您的进程读取。 dup
文件描述符不会使数据可用两次,因此使用dup2的方法无效(事实上,dup2(fds[1], STDOUT_FILENO)
首先关闭STDOUT_FILENO,所以现在你只是要写入管道)。您可以分叉复制数据的进程,或使用splice / tee系统调用来复制数据,但实际上您需要问:为什么要这样做?
答案 2 :(得分:0)
答案 3 :(得分:0)
如果您使用的是Linux,则可以使用fmemopen:
#include <iostream>
#include <stdio.h>
char mybuffer[BUFF_SIZE];
FILE * pFile = fmemopen(mybuffer, BUFF_SIZE, "w");
std::swap(stdout, pFile); //swap pFile to stdout
rc = someFunctionWritingToStdout();
std::swap(stdout, pFile); //restore
fclose(pFile); // flush and close stream
cout << "-....-" << endl;
cout << mybuffer << endl;
cout << "-....-" << endl;