2012-09-01 146 views
0

我有一個C函數打印到標準輸出使用fprintf,我試圖在UIAlertView顯示標準輸出的內容。我的代碼如下:Objective C打印標準輸出到UIAlertView

NSFileHandle *stdoutFileHandle = [NSFileHandle fileHandleWithStandardOutput]; 
NSData *stdoutData = [stdoutFileHandle availableData]; 
NSString *stdoutString = [[NSString alloc] initWithData:stdoutData encoding:NSASCIIStringEncoding]; 

UIAlertView *stdoutAlert = [[UIAlertView alloc] initWithTitle:@"STDOUT OUTPUT" message:stdoutString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
[stdoutAlert show]; 

我在運行我的代碼時遇到以下錯誤。

終止應用程序由於未捕獲的異常 'NSFileHandleOperationException',原因: '[NSConcreteFileHandle availableData]:錯誤的文件描述符'

我得到一個相當於錯誤,當我與[stdoutFileHandle readDataToEndOfFile]取代[stdoutFileHandle availableData]

+0

你真正需要做的是使用'select'和一個UNIX文件描述符。傑弗瑞 –

回答

4

問題是您正在從輸出流中讀取數據。要做到這一點,你需要詭計stdout將其內容寫入輸入流而不是控制檯。

我知道老C的做法,但你不會喜歡它。這使用pipe()和dup2()。

int pipefd[2]; 

pipe(pipefd); 
dup2(pipefd[1], STDOUT_FILENO); 
close(pipefd[1]); 

在寫入stdout這點任何東西都可以通過pipefd[0]讀取。此時,您可以使用-initWithFileDescriptor:pipefd[0]中讀取。

NSFileHandle *stdoutReader = [[NSFileHandle alloc] initWithFileDescriptor:pipefd[0]]; 

請注意,您將需要進行大量的錯誤檢查。希望有所幫助。

+0

,這段代碼工作正常。非常感謝! – JMLdev

1

我跟着選定答案後在這個問題: What is the best way to redirect stdout to NSTextView in Cocoa?

它覺得有點更熟悉跟着我。我爲pipe和read處理程序創建了NSPipe和NSFileHandler對象,並使用了通知。我把開放的方法在下面的viewDidAppear和viewDidDisappear方法的,因爲我的需求,但你可以把它放在任何地方是適當

// Piping stdout info from here WILL NOT PIPE NSLOG: 
// https://stackoverflow.com/questions/2406204/what-is-the-best-way-to-redirect-stdout-to-nstextview-in-cocoa 
- (void) openConsolePipe { 
    _pipe = [NSPipe pipe]; 
    _pipeReadHandle = [_pipe fileHandleForReading] ; 
    dup2([[_pipe fileHandleForWriting] fileDescriptor], fileno(stdout)) ; 

    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNotification:) name: NSFileHandleReadCompletionNotification object: _pipeReadHandle] ; 
    [_pipeReadHandle readInBackgroundAndNotify] ; 
} 

- (void) closeConsolePipe { 
    if (_pipe != nil) { 
     [[_pipe fileHandleForWriting] closeFile]; 

     // documentation suggests don't need to close reading file handle b/c auto but this suggests otherwise: 
     // https://stackoverflow.com/questions/13747232/using-nstask-and-nspipe-causes-100-cpu-usage 
//  [[_pipe fileHandleForReading] closeFile]; 
    } 
} 

- (void) handleNotification:(NSNotification *)notification { 
    [_pipeReadHandle readInBackgroundAndNotify] ; 
    NSString *str = [[NSString alloc] initWithData: [[notification userInfo] objectForKey: NSFileHandleNotificationDataItem] encoding: NSUTF8StringEncoding]; 

    // do what you want with the str here. 
    [_consoleView setText:[_consoleView.text stringByAppendingString:str]]; 
    [_consoleView scrollRangeToVisible:NSMakeRange([_consoleView.text length], 0)]; 
} 

我希望這最終幫助別人,谷歌搜索這...

相關問題