是否可以从stdout读取?

时间:2016-01-23 18:06:57

标签: c unix stdout

如果我使用UIViewController,是否有任何方法可以阅读我在stdout中打印的内容?

我看到了C language. Read from stdout(它使用了管道),但它不起作用:

viewForHeaderInSection

我也尝试使用文件描述符,但它都不起作用:

def __init__(self, coord=None):
    coord = coord or rand_pos()

我该怎么办?

4 个答案:

答案 0 :(得分:1)

通常不会,除非标准输出已重定向到文件。写入标准输出的函数(如printf())不会在您的进程中的任何位置记录它们的输出,并且无法从正常文件以外的任何内容读取您之前的输出*。例如,如果您的进程正在将其输出打印到终端,尝试从终端读取数据将返回用户输入的内容,而不是您之前输出的内容。

你的第二个程序几乎正在工作。但是,您需要首先解决一些小问题:

  1. 第一个printf()的输出不会输出,因为它缺少换行符。添加新行,或者调用fflush(stdout)以强制输出。

  2. 您正在尝试printf()您的搜索结果,但标准输出仍然指向该文件,因此您永远不会看到它。覆盖标准输出后显示内容的最简单方法是使用fprintf(stderr, ...)

  3. (*:或者某些行为很像文件,比如块设备或命名管道。但你可能不会使用这些。)

答案 1 :(得分:1)

如果stdout是一个文件,你可以打开另一个文件描述符并查找和阅读。如果它是管道,另一方面,你不能。写入管道的数据只能读取一次。如果该管道的读取端与tty相关联,则它将由设备驱动程序读取,并且不再可供您的进程读取。 dup文件描述符不会使数据可用两次,因此使用dup2的方法无效(事实上,dup2(fds[1], STDOUT_FILENO)首先关闭STDOUT_FILENO,所以现在你只是要写入管道)。您可以分叉复制数据的进程,或使用splice / tee系统调用来复制数据,但实际上您需要问:为什么要这样做?

答案 2 :(得分:0)

访问:

https://github.com/pouyanh/isolated-iostream

这是关于在调用另一个函数时透明地输出缓冲stdout

答案 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;

https://www.systutorials.com/docs/linux/man/3-fmemopen/