刷新之前如何查看stdout缓冲区?

时间:2020-05-17 04:50:53

标签: c printf buffer stdout flush

是否有可能在刷新之前查看public static BufferedImage rasterize(File svgFile) throws IOException { final BufferedImage[] imagePointer = new BufferedImage[1]; // Rendering hints can't be set programatically, so // we override defaults with a temporary stylesheet. // These defaults emphasize quality and precision, and // are more similar to the defaults of other SVG viewers. // SVG documents can still override these defaults. String css = "svg {" + "shape-rendering: geometricPrecision;" + "text-rendering: geometricPrecision;" + "color-rendering: optimizeQuality;" + "image-rendering: optimizeQuality;" + "}"; File cssFile = File.createTempFile("batik-default-override-", ".css"); FileUtils.writeStringToFile(cssFile, css); TranscodingHints transcoderHints = new TranscodingHints(); transcoderHints.put(ImageTranscoder.KEY_XML_PARSER_VALIDATING, Boolean.FALSE); transcoderHints.put(ImageTranscoder.KEY_DOM_IMPLEMENTATION, SVGDOMImplementation.getDOMImplementation()); transcoderHints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, SVGConstants.SVG_NAMESPACE_URI); transcoderHints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT, "svg"); transcoderHints.put(ImageTranscoder.KEY_USER_STYLESHEET_URI, cssFile.toURI().toString()); try { TranscoderInput input = new TranscoderInput(new FileInputStream(svgFile)); ImageTranscoder t = new ImageTranscoder() { @Override public BufferedImage createImage(int w, int h) { return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); } @Override public void writeImage(BufferedImage image, TranscoderOutput out) throws TranscoderException { imagePointer[0] = image; } }; t.setTranscodingHints(transcoderHints); t.transcode(input, null); } catch (TranscoderException ex) { // Requires Java 6 ex.printStackTrace(); throw new IOException("Couldn't convert " + svgFile); } finally { cssFile.delete(); } return imagePointer[0]; 缓冲区中的内容?如果可以,怎么办?

例如,我正在调试以下代码:

stdout

如果我在调试器的最后一行停止,我想查看该缓冲区,其中应包含for(int i = 0; i < 10; i++){ printf("%d ", i); } printf("\n"); // Break point on this line

1 个答案:

答案 0 :(得分:2)

通常不能,但是如果使用setvbuf(),则可以用您创建的libc覆盖libc使用的专用缓冲区。在那些printf()调用之前执行此操作应使数据在刷新之前最终存储在缓冲区中。

char mybuffer[BUFSIZ]; // BUFSIZ is defined in <stdio.h>
setvbuf(stdout, mybuffer, _IOLBF, BUFSIZ);

无论如何,您在缓冲区中发现的肯定不是记录在案的东西,所以缓冲区的内容可能不是您所期望的。例如,我自己进行了一些测试,发现glibc似乎并不喜欢较小的缓冲区,并且有时会忽略用户缓冲区(不过您应该对BUFSIZ感到满意)。