您可以使用setbuf(stdout,NULL)关闭行缓冲,或使用setbuf(stdout,uBuff)设置新缓冲区,uBuff是您指定的缓冲区. 您也可以使用setvbuf(stdout,NULL,_IOFBF,0);将标准输出更改为完全缓冲. 完全缓冲和行缓冲之间的区别在于,遇到换行符时不会刷新缓冲区.
printf在VC ++中默认情况下关闭缓冲区,它将在[3] [3] ^ {[3]}的时间输出到屏幕. 如果显示缓冲区已打开,则只能设置完整缓冲区. 由于Microsoft是封闭源代码,因此我们无法研究printf函数的源代码.
可以看到Linux和Windows下的缓冲区管理: C的完整缓冲区,行缓冲区和未缓冲区.
此摘要写于2018年1月15日. 两年后的今天,我在互联网上寻找答案,终于解决了之前的疑问.
当输出宽字符串时,发现同时使用printf和wprintf时,以后使用的函数没有输出. 建议不要同时使用printf和wprintf,以免出错.
printf和wprintf不能同时输出宽字符串的示例代码如下:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(int argc,char* argv[]){
char test[]="测试Test";
setlocale(LC_ALL,"zh_CN.UTF-8");
wchar_t wtest[]=L"0m~K0m~UTest";
printf("printf:%S\n",wtest); //语句1:可正常输出"测试Test"
wprintf(L"wprintf:%S\n",wtest); //语句2:无任何内容输出
}
在上面的代码中,语句1和语句2不能同时存在,否则只能正常输出第一个. 我不知道Windows平台上是否还存在这种问题,有兴趣的读者可以尝试一下. 关于原因,GNU正式文件中明确指出不能同时使用printf和wprintf,内容如下:
It is important to never mix the use of wide and not wide operations on a stream. There are no diagnostics issued. The application behavior will simply be strange or the application will simply crash.
这是因为创建输出流时没有流方向. 一旦使用了printf(多字节流)或wprintf(宽字符流)printf输出数字,它将被设置为相应的流方向,并且无法更改. 您可以使用以下函数来获取当前输出流的流方向.
// //@param:stream:文件流;mode:取值可以>0,=0或<0 //@ret:<0:流已被设置为多字节流定向;=0:流尚未被设置;>0:流已被设置为宽字符流定向 // int fwide (FILE* stream, int mode); //获取当前标准输出流定向 int ret=fwide(stdout,0);
Fwide可以设置当前的流方向,前提是没有I / O操作,也就是说,当前流尚未设置任何流方向. 顺便说一句,我不知道为什么标准库函数fwide在实现上如此受限. 具体操作如下:
//设置标准输出流定向为多字节流定向 fwide(stdout,-1); //设置标准输出流定向为宽字符流定向 fwide(stdout,1);
由于GNU C存在此问题,应如何解决?这里有两种方法: (1)统一使用函数. 例如:
wprintf(L"%s","a\n"); wprintf(L"b\n");
或
printf("a\n");
printf("%ls\n",L"b");
(2)使用freopen清除流向.
//重新打开标准输出流,清空流定向
FILE* pFile=freopen("/dev/tty","w",stdout);
wprintf(L"wide freopen succeeded\n");
//重新打开标准输出流,清空流定向
pFile=freopen("/dev/tty","w",stdout);
printf("narrow freopen succeeded\n");
以上内容允许同时使用printf和wprintf.
用了将近两年的时间,终于完成了这个看似基本但复杂的printf()使用. 由于时间和个人水平的限制,本文的不足之处是不可避免的. 我还要求读者批评和纠正它们,而不是感激.
[1]讨论C中的wprintf和宽字符显示[2] printf.C ++参考[3]为什么在调用之后,除非换行符在格式字符串中,否则printf不会刷新? [4]格式规范语法: printf和wprintf函数[5] [6] fwide.C ++参考 p>
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-157230-2.html
40年