user-0 提问: 标准输入输出缓冲区、和stdin、stdout疑问

回复:
user: user-1
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-2
content: stdin expression of type FILE* associated with the input stream stdout expression of type FILE* associated with the output stream stderr expression of type FILE* associated with the error output stream

user: user-3
content: 1.不一定，比如你使用输入法，键盘输入的值被传递到输入法，输入法再转化成字符。 ２.请搜索codepage 3.输入１００，二进制形式为0x64, 写入４个字节，依次是0x64,0x00,0x00,0x00；  在屏幕上以ASＣＩＩ字符方式显示，0x64显示为d，另外３个无法显示  然后读b的值，为什么是０我暂时也不清楚。 然后读c的值，读４个字节是不够的，所有输入的３９是c未初始化时的值。 ＡＳＣＩＩ码为０是无法打印的，所以在屏幕上是空的

user: user-4
content: 楼主， 你读的话就是用stdin， 怎么还用stdout， 根本不匹配， 程序错了…

user: user-0
content: 引用 18 楼 ipqtjmqj的回复:[quote=引用 14 楼 qq_28330649 的回复:] [quote=引用 11 楼 ipqtjmqj 的回复:] [quote=引用 10 楼 qq_28330649 的回复:] [quote=引用 2 楼 ipqtjmqj的回复:]1.不一定，比如你使用输入法，键盘输入的值被传递到输入法，输入法再转化成字符。 ２.请搜索codepage 3.输入１００，二进制形式为0x64, 写入４个字节，依次是0x64,0x00,0x00,0x00；  在屏幕上以ASＣＩＩ字符方式显示，0x64显示为d，另外３个无法显示  然后读b的值，为什么是０我暂时也不清楚。 然后读c的值，读４个字节是不够的，所有输入的３９是c未初始化时的值。 ＡＳＣＩＩ码为０是无法打印的，所以在屏幕上是空的 或许输入法从输入文件中获取数据的呢[/quote] 这个我也不清楚，不管中间有没有键盘缓冲区，最终都是到了stdin，你把stdin理解为一个文件就可以了， 而且stdin可以重定向到文件[/quote]  当前关于标准输入输出的一些猜测： 当按下键盘上的字符时，字符以ascii码的形式存储在stdin文件中，I/O函数（以scanf（）为例子）从此获取数据（字符编码），并按格式符读取，按格式符转化，最后将值赋予变量；在输出时I/O函数（以printf（））为例：它从内存获得一个二进制数值，然后根据格式转换符转换成相应的ascii码表示形式的数值，然后写入stdout文件，显卡从stdout获得的是ascii码，这样理解对吗[/quote] 显卡只知道这个像素该填什么颜色。 stdout中存的是ASCII码，然后操作系统使用字体将ASCII转成图片的形式才显示出来[/quote] 我刚才修改了下程序重新测试，发现fread函数并未从stdout成功读取数值，但编译通过，难道stdout不能作为fread的参数吗

user: user-3
content: 引用 14 楼 qq_28330649 的回复:[quote=引用 11 楼 ipqtjmqj 的回复:] [quote=引用 10 楼 qq_28330649 的回复:] [quote=引用 2 楼 ipqtjmqj的回复:]1.不一定，比如你使用输入法，键盘输入的值被传递到输入法，输入法再转化成字符。 ２.请搜索codepage 3.输入１００，二进制形式为0x64, 写入４个字节，依次是0x64,0x00,0x00,0x00；  在屏幕上以ASＣＩＩ字符方式显示，0x64显示为d，另外３个无法显示  然后读b的值，为什么是０我暂时也不清楚。 然后读c的值，读４个字节是不够的，所有输入的３９是c未初始化时的值。 ＡＳＣＩＩ码为０是无法打印的，所以在屏幕上是空的 或许输入法从输入文件中获取数据的呢[/quote] 这个我也不清楚，不管中间有没有键盘缓冲区，最终都是到了stdin，你把stdin理解为一个文件就可以了， 而且stdin可以重定向到文件[/quote]  当前关于标准输入输出的一些猜测： 当按下键盘上的字符时，字符以ascii码的形式存储在stdin文件中，I/O函数（以scanf（）为例子）从此获取数据（字符编码），并按格式符读取，按格式符转化，最后将值赋予变量；在输出时I/O函数（以printf（））为例：它从内存获得一个二进制数值，然后根据格式转换符转换成相应的ascii码表示形式的数值，然后写入stdout文件，显卡从stdout获得的是ascii码，这样理解对吗[/quote] 显卡只知道这个像素该填什么颜色。 stdout中存的是ASCII码，然后操作系统使用字体将ASCII转成图片的形式才显示出来

user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-1
content: 按Alt+8，单步fread、fwrite、printf等函数对应的汇编指令几步后，就会来到它们对应的C源代码处。

user: user-1
content: 相关源代码都可以被单步调试的，为什么还要猜测、讨论呢？单步进去观察不就够够的了？

user: user-0
content: 引用 11 楼 ipqtjmqj 的回复:[quote=引用 10 楼 qq_28330649 的回复:] [quote=引用 2 楼 ipqtjmqj的回复:]1.不一定，比如你使用输入法，键盘输入的值被传递到输入法，输入法再转化成字符。 ２.请搜索codepage 3.输入１００，二进制形式为0x64, 写入４个字节，依次是0x64,0x00,0x00,0x00；  在屏幕上以ASＣＩＩ字符方式显示，0x64显示为d，另外３个无法显示  然后读b的值，为什么是０我暂时也不清楚。 然后读c的值，读４个字节是不够的，所有输入的３９是c未初始化时的值。 ＡＳＣＩＩ码为０是无法打印的，所以在屏幕上是空的 或许输入法从输入文件中获取数据的呢[/quote] 这个我也不清楚，不管中间有没有键盘缓冲区，最终都是到了stdin，你把stdin理解为一个文件就可以了， 而且stdin可以重定向到文件[/quote]  当前关于标准输入输出的一些猜测： 当按下键盘上的字符时，字符以ascii码的形式存储在stdin文件中，I/O函数（以scanf（）为例子）从此获取数据（字符编码），并按格式符读取，按格式符转化，最后将值赋予变量；在输出时I/O函数（以printf（））为例：它从内存获得一个二进制数值，然后根据格式转换符转换成相应的ascii码表示形式的数值，然后写入stdout文件，显卡从stdout获得的是ascii码，这样理解对吗

user: user-3
content: 引用 12 楼 qq_28330649 的回复:[quote=引用 5 楼 ipqtjmqj的回复:]我试了，两次fread的返回值都为０ 什么意思，我是将标准输出文件的一个字节二进制值读入变量b，那应该是100，为什么是0[/quote] fread的返回值为０说明变量b的值没变

user: user-0
content: 引用 5 楼 ipqtjmqj的回复:我试了，两次fread的返回值都为０ 什么意思，我是将标准输出文件的一个字节二进制值读入变量b，那应该是100，为什么是0

user: user-3
content: 引用 10 楼 qq_28330649 的回复:[quote=引用 2 楼 ipqtjmqj的回复:]1.不一定，比如你使用输入法，键盘输入的值被传递到输入法，输入法再转化成字符。 ２.请搜索codepage 3.输入１００，二进制形式为0x64, 写入４个字节，依次是0x64,0x00,0x00,0x00；  在屏幕上以ASＣＩＩ字符方式显示，0x64显示为d，另外３个无法显示  然后读b的值，为什么是０我暂时也不清楚。 然后读c的值，读４个字节是不够的，所有输入的３９是c未初始化时的值。 ＡＳＣＩＩ码为０是无法打印的，所以在屏幕上是空的 或许输入法从输入文件中获取数据的呢[/quote] 这个我也不清楚，不管中间有没有键盘缓冲区，最终都是到了stdin，你把stdin理解为一个文件就可以了， 而且stdin可以重定向到文件

user: user-0
content: 引用 2 楼 ipqtjmqj的回复:1.不一定，比如你使用输入法，键盘输入的值被传递到输入法，输入法再转化成字符。 ２.请搜索codepage 3.输入１００，二进制形式为0x64, 写入４个字节，依次是0x64,0x00,0x00,0x00；  在屏幕上以ASＣＩＩ字符方式显示，0x64显示为d，另外３个无法显示  然后读b的值，为什么是０我暂时也不清楚。 然后读c的值，读４个字节是不够的，所有输入的３９是c未初始化时的值。 ＡＳＣＩＩ码为０是无法打印的，所以在屏幕上是空的 或许输入法从输入文件中获取数据的呢

user: user-0
content: 引用 7 楼 ipqtjmqj的回复:[quote=引用 6 楼 qq_28330649 的回复:] 1.不一定，比如你使用输入法，键盘输入的值被传递到输入法，输入法再转化成字符。 ２.请搜索codepage 3.输入１００，二进制形式为0x64, 写入４个字节，依次是0x64,0x00,0x00,0x00；  在屏幕上以ASＣＩＩ字符方式显示，0x64显示为d，另外３个无法显示  然后读b的值，为什么是０我暂时也不清楚。 然后读c的值，读４个字节是不够的，所有输入的３９是c未初始化时的值。 ＡＳＣＩＩ码为０是无法打印的，所以在屏幕上是空的  就是要解决这个问题啊，我知道的是：按下键盘，字符以编码形式存入输入缓冲区（问题：这个缓冲区是否就是那个stdin文件内存空间）， 假如我键入字符de，用语句 scanf("%d", &a) 读取，然后printf（“%d”，%d）打印d的值却是2，（问题：这些转化都是由这个函数实现的吗） 当执行printf（“%d”，100）；问题：在输出文件stdout中的数据是100的二进制形式，还是100的字符表示形式， 总之一句话，告诉 { scanf("%d", &a);   printf("%d", a); } 数据流从开始到最后的细节，具体的函数实现可以不说，指明就好，但要与上面编译结果相符 键入字符de，再scanf("%d", &a)肯定失败的，因为%d代表decimal, 十进制，你可以通过检查scanf的返回值查看是否成功。你打印出的２是a本来的值。 printf中f是format的缩写，叫格式化打印，打印出来就是让人看的，所以不管原来什么格式，都转成字符串形式， scanf则相反，是把字符串格式转换成指定的格式。 [/quote] 我知道不能实现，但我想知道为什么输出2

user: user-0
content: 引用 1 楼 user-4的回复:楼主， 你读的话就是用stdin， 怎么还用stdout， 根本不匹配， 程序错了… fread不可以读输出文件的二进制数据吗

user: user-3
content: 引用 6 楼 qq_28330649 的回复:1.不一定，比如你使用输入法，键盘输入的值被传递到输入法，输入法再转化成字符。 ２.请搜索codepage 3.输入１００，二进制形式为0x64, 写入４个字节，依次是0x64,0x00,0x00,0x00；  在屏幕上以ASＣＩＩ字符方式显示，0x64显示为d，另外３个无法显示  然后读b的值，为什么是０我暂时也不清楚。 然后读c的值，读４个字节是不够的，所有输入的３９是c未初始化时的值。 ＡＳＣＩＩ码为０是无法打印的，所以在屏幕上是空的  就是要解决这个问题啊，我知道的是：按下键盘，字符以编码形式存入输入缓冲区（问题：这个缓冲区是否就是那个stdin文件内存空间）， 假如我键入字符de，用语句 scanf("%d", &a) 读取，然后printf（“%d”，%d）打印d的值却是2，（问题：这些转化都是由这个函数实现的吗） 当执行printf（“%d”，100）；问题：在输出文件stdout中的数据是100的二进制形式，还是100的字符表示形式， 总之一句话，告诉 { scanf("%d", &a);   printf("%d", a); } 数据流从开始到最后的细节，具体的函数实现可以不说，指明就好，但要与上面编译结果相符 键入字符de，再scanf("%d", &a)肯定失败的，因为%d代表decimal, 十进制，你可以通过检查scanf的返回值查看是否成功。你打印出的２是a本来的值。 printf中f是format的缩写，叫格式化打印，打印出来就是让人看的，所以不管原来什么格式，都转成字符串形式， scanf则相反，是把字符串格式转换成指定的格式。

user: user-0
content: 1.不一定，比如你使用输入法，键盘输入的值被传递到输入法，输入法再转化成字符。 ２.请搜索codepage 3.输入１００，二进制形式为0x64, 写入４个字节，依次是0x64,0x00,0x00,0x00；  在屏幕上以ASＣＩＩ字符方式显示，0x64显示为d，另外３个无法显示  然后读b的值，为什么是０我暂时也不清楚。 然后读c的值，读４个字节是不够的，所有输入的３９是c未初始化时的值。 ＡＳＣＩＩ码为０是无法打印的，所以在屏幕上是空的  就是要解决这个问题啊，我知道的是：按下键盘，字符以编码形式存入输入缓冲区（问题：这个缓冲区是否就是那个stdin文件内存空间）， 假如我键入字符de，用语句 scanf("%d", &a) 读取，然后printf（“%d”，%d）打印d的值却是2，（问题：这些转化都是由这个函数实现的吗） 当执行printf（“%d”，100）；问题：在输出文件stdout中的数据是100的二进制形式，还是100的字符表示形式， 总之一句话，告诉 { scanf("%d", &a);   printf("%d", a); } 数据流从开始到最后的细节，具体的函数实现可以不说，指明就好，但要与上面编译结果相符

user: user-3
content: 我试了，两次fread的返回值都为０