0

我正在尝试使用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...) 应该保存在另一个文件中。

任何想法?谢谢

4

1 回答 1

1

目前尚不清楚您为什么要这样做。你不能直接用fprintf吗?对于对象 AFAIKNSLog只需调用- (NSString*)description您可以自己轻松完成的操作。

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

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

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

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

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

于 2014-07-20T19:58:03.983 回答