2013-03-22 57 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