2014-07-20 43 views
0

我試圖使用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 ...)應該保存在另一個文件中。

任何想法? 謝謝

+0

你的問題不清楚。你預期會發生什麼?實際發生了什麼,它與你期望的有什麼不同?如果你期望寫給'stderr'的文件同時出現在兩個文件中,那麼,不,這是不可能的。 –

+1

如果你想做到這一點,然後轉儲'NSLog()'並寫自己的日誌框架或使用現有的,如CocoaLumberjack:https://github.com/CocoaLumberjack/CocoaLumberjack – trojanfoe

回答

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自動關閉。

+0

實際上,'NSLog()'使用[ASL(Apple系統日誌記錄)工具](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/asl.3.html)。 –

+0

@per Johansson 非常感謝,我用我自己的日誌記錄解決了這個問題,我一直在嘗試一切。 – josef

相關問題