2013-03-22 53 views
0

我試圖爲iphone做一個Java解釋器,但是我使用的library只打印控制檯輸出到NSLog/printf控制檯。我希望它返回一個std :: string,我可以轉換爲NSString並顯示在UITextView中。這是否做過?要麼捕獲控制檯日誌(它需要被appstore接受),要麼改變源添加一個方法來返回一個字符串與緩衝區。慢跑Java解釋器返回字符串控制檯輸出

+0

什麼樣的字符串?一個'char *'或一個'wchar_t *'或一個'std :: string'或一個'NSString'? – 2013-03-22 07:08:49

+0

轉換是可能的,所以它沒有關係。 – 2013-03-22 07:43:38

回答

1

C標準輸入和輸出庫是你的朋友。

你應該知道NSLog輸出到stderr和printf使用stdout。所以根據你的需要,你可以只重定向一個或兩個,如果你需要所有的輸出。假設我們將所有的流寫入一個文件(在我們的stdout和sdterr的例子中是兩個),然後當我們完成後關閉這些文件,然後您可以簡單地使用文件保存到文檔目錄中來顯示它們。

// get user directory 
    NSArray *allPaths  = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDIR = [allPaths objectAtIndex:0]; 
    NSString *pathForLog = [documentsDIR stringByAppendingPathComponent:@"logFile.txt"]; 
    NSString *pathForError = [documentsDIR stringByAppendingPathComponent:@"errorFile.txt"]; 

// redirect the stream 
    freopen([pathForError cStringUsingEncoding:NSASCIIStringEncoding],"w", stderr); // NSLog 
    freopen([pathForLog cStringUsingEncoding:NSASCIIStringEncoding], "w", stdout); // printf 

// your log stuff 
    printf("i am a robot\n"); 
    NSLog(@"And i do bip bipbip biiiip"); 

// when you are done, close the stream 
    fclose (stdout); 
    fclose (stderr); 

// and retrieve your data, as NSString object (or whatever you want) 
    NSString* dataLog = [NSString stringWithContentsOfFile: pathForLog 
                encoding: NSASCIIStringEncoding 
                error: nil]; 

    NSString* errorLog = [NSString stringWithContentsOfFile: pathForError 
                encoding: NSASCIIStringEncoding 
                 error: nil]; 
+0

工程就像一個魅力! – 2013-03-22 14:28:38