0

我试图为 iphone 制作一个 java 解释器,但是我使用的库只将控制台输出打印到 NSLog/printf 控制台。我希望它返回一个 std::string,我可以将其转换为 NSString 并显示在 UITextView 中。以前有这样做过吗?捕获控制台日志(它需要被应用商店接受)或更改源添加方法以返回带有缓冲区的字符串。

4

1 回答 1

1

C 标准输入和输出库是你的朋友。

您应该知道到 stderr 和 printf 的 NSLog 输出使用 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];
于 2013-03-22T09:54:41.013 回答