Ios 斯威夫特·斯特德和斯托特成了一个文件

Ios 斯威夫特·斯特德和斯托特成了一个文件,ios,swift,stdout,nslog,freopen,Ios,Swift,Stdout,Nslog,Freopen,对于iPhone应用程序,我需要将调试数据收集到一个文件中,然后发送到在线服务进行分析。通过将stderr输出转移到文件句柄,并在适当的时候发送文件,可以很好地工作。(NSLog输出也会在stderr中结束,因此这种方法适用于所有方面。)同样的方法也适用于stdout 下面是我如何保存到文件的步骤: freopen(cStringFilePath, "a+", stderr) // or stdout 上面正确地返回了一个UnsafeMutablePointer,我会跟踪它,以便在必要时关闭文

对于iPhone应用程序,我需要将调试数据收集到一个文件中,然后发送到在线服务进行分析。通过将
stderr
输出转移到文件句柄,并在适当的时候发送文件,可以很好地工作。(
NSLog
输出也会在
stderr
中结束,因此这种方法适用于所有方面。)同样的方法也适用于
stdout

下面是我如何保存到文件的步骤:

freopen(cStringFilePath, "a+", stderr) // or stdout
上面正确地返回了一个
UnsafeMutablePointer
,我会跟踪它,以便在必要时关闭文件

但是,我需要
stdout
stderr
的内容放在一个文件中,并逐行列出正确的时间顺序

原因是我试图调试一个第三方框架,该框架生成诊断输出,但将其写入
stdout
,而不是
stderr


你知道怎么做吗?

你试过打两次电话给freopen吗?一次使用
stderr
和一次使用
stdout
?当我尝试时,我认为这对我的目的很有效

你试过打两次电话给freopen吗?一次使用
stderr
和一次使用
stdout
?当我尝试时,我认为这对我的目的很有效

不,它似乎只会捕获您上次使用的一个。更正。它似乎起作用了。哇!但它安全吗?如果两个流同时尝试访问该文件会怎样?是的,它应该是“安全的”,即它不应该崩溃,但由于缓冲规则,您可能会得到交错的输出。我想您可以修改这些文件描述符上的缓冲方式,但我不确定如何使用@Mundi:
setlinebuf()
将stdout/stderr设置为行缓冲模式()。默认情况下,在写入文件时,这两个文件都是无缓冲的。不,它似乎只会捕获您上次使用的文件。更正。它似乎起作用了。哇!但它安全吗?如果两个流同时尝试访问该文件会怎样?是的,它应该是“安全的”,即它不应该崩溃,但由于缓冲规则,您可能会得到交错的输出。我想您可以修改这些文件描述符上的缓冲方式,但我不确定如何使用@Mundi:
setlinebuf()
将stdout/stderr设置为行缓冲模式()。默认情况下,在写入文件时,这两个文件都是无缓冲的。