尝试使用freopen但是对于两个不同的文件

时间:2014-07-20 18:41:40

标签: xcode nslog freopen

我正在尝试使用freopen()打印到两个不同的文件。 有可能吗?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex: 0];
NSString *docFile = [docDir stringByAppendingPathComponent: @"sensordata.txt"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:docDir])
{
    [fileManager createFileAtPath:docFile contents:nil
                                   attributes:nil];
}
freopen([docFile cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
NSLog(@"GyroData: %f %f %f ",gyroData.rotationRate.x, gyroData.rotationRate.y, gyroData.rotationRate.z);


NSLog(@"DeviceMotion: %f  ",magnitude);

第二个NSLog(DeviceMotion ...)应该保存在另一个文件中。

任何想法? 感谢

1 个答案:

答案 0 :(得分:0)

目前还不清楚为什么要这样做。你不能只用fprintf吗?对于对象AFAIK NSLog只需调用- (NSString*)description即可轻松完成。

无论如何,这里(可能)如何:

NSLog很可能直接写入底层STDERR_FILENO文件描述符(fd)。您可以使用dup2系统调用更改该fd的目标。

如果您仍想使用FILE*函数,它看起来像这样(未经测试,需要进行错误检查):

FILE *newlogfile = fopen([docFile fileSystemRepresentation], "a+");
dup2(fileno(newlogfile), STDERR_FILENO);
fclose(newlogfile);

您不必保留指向该文件的指针,因为描述符是重复的。旧的STDERR_FILENO fd会自动关闭。