抄书(标准C语言指南)
1.7 输入和输出
C有完善的数据和控制流处理机制,但并不提供任何输入/输出手段。因此,为了实现这样的目的,往往需要借助于机器语言、汇编语言,或者调用为特定设备而编写的库函数。如果程序是在宿主式环境下运行的,那么,调用操作系统提供的例程(函数)往往是最方便的选择,有时也是唯一的选择。
为了更好的演示如果调用操作系统的功能,我们特地将工作的环境选取为大家都能熟悉的Windows,并假定下面的程序代码已经被保护为源文件wincon.c:
__stdcall void * GetStdHandle (unsigned long);
__stdcall int WriteConsoleA (void *,const void *,unsigned long *,unsigned long,unsigned long *,void *);
int wsprintfA (char *,const char *, ...);#define BUFF_SIZE 256
#define STD_OUTPUT -11
int main (void)
{int i =1,sum =0;while (i<=100) sum += i++;char msg [BUFF_SIZE];WriteConsoleA (GetStdHandle (STD_OUTPUT),msg,wsprintfA (msg,"1+2+3+...100=%d",sum),& (unsigned long) {0},0);return 0;
}
这个程序要在32位Windows控制台下转换和运行,用的是GCC在Windows操作系统上的移植版本MinGW。
通常来说,为了使用Windows提供的功能,应用程序需要借助于Windows应用程序编程接口(Application Programming Interface,API),这是一整套例程(函数)、协议和工具的集合。Windows API 是通过一套称为动态链接库(DLL)的模块来实现的,DLL包含了大量的函数和数据,可以被应用程序或者其他DLL使用。只要在计算机上安装了Windows操作系统,就会存在这些动态链接库。
为了向Windows控制台屏幕输出文本,可以使用函数WriteConsoleA,他的功能是在控制台屏幕缓冲区的当前光标处写一串文本,动态链接库kernel32.dll中包含了该函数的代码以及其他相关信息。函数WriteConsoleA需要5个参数,分别是:
- 一个指针,是指向同控制台标准输出(一般是指屏幕)相关联的对象。该指针是通过调用另一个函数GetStdHandle得到的,该函数位于动态链接库kernel32.dll中。GetStdHandle需要接收一个unsigned long类型的参数,这是一个于设备相关的整数。在当前程序中,该参数是-11,指示标准输出(STD_OUTPUT)。
- 一个指针,指向要输出的字符串
- 字符串的长度。
- 一个指向unsigned long类型的指针,用于保护实际写入到控制台标准输出的字符数量,由WriteConsoleA函数在返回之前填写。
- 保留的参数,必须是空指针。
以上程序中,俩个“#define”引导的行是预处理指令,用于定义预处理宏。
再出一个例子程序,该程序的功能是播放一段音乐,然后显示一个对话框。程序的转换和运行环境与wincon.c相同,都是Windows。假定源文件位wingui.c,要播放的波形(音乐)文件是musi.wav,该波形文件应当位于转换后的程序所在目录。
typedef struct (int i;) stgHWND;
__stdcall int MessageBoxA (stgHWND *,const char *,\const char *,unsigned);
__stdcall int PlaySound (const char *,stgHWMND *, unsigned long);
#define SND_FILENAME 0x20000
#define MB_OK 0
#define MB_ICONINFPRMATION 64
int main (void)
{PlaySound("music.wav",0,SND_FILENAME);MessageBoxA (0,"音乐播放完毕,请单击“确定”按钮退出当前程序。",“WIN32编程示例”,MB_OK | MB_ICONINFORMATION);return 0;}
函数PlaySound位于动态链接库winmm.dll中,他的功能是播放声音。该函数需要如下3个参数:
- 一个指向字符串的指针,用于指定声音来源;
- 一个指针,如果要播放的声音来自于一个程序模块内的资源数据(典型的WIN32程序除了指令和数据外,还可以包含图标、多媒体、菜单、对话框等资源),则他指向与该程序模块相关联的对象。在其他情况下,他应当是一个空指针;
- 一个标志,用于控制声音的播发和指定声音的类型。在当前程序中使用的值是0x20000(SND_FILENAME),他的意思是第一个参数指向文件名。
函数MessageBoxA位于动态链接库kernel32.dll,他的功能是弹出一个可能拥有按钮、系统图标,以及一条简短信息的模态对话框。该函数需要如下4个参数:
- 一个指针,如果要创建的信息科有父窗口,则指向与父窗口相关联的对象的指针。如果要创建的消息框没有父窗口,则他应为空指针;
- 一个指针,指向要显示的消息文本;
- 一个指针。可以自定义消息框标题栏的内容,用这个指针指向标题栏文本
- 一个标志,用于控制消息框的外观和行为,他可以是几个不同标志的合并。MB_OK表示消息框拥有一个“确定”按钮;MB_ICONINFORMATION用于显示一个“i”形的图标。
这个程序以然要分俩步进行转换,首先是生成目标文件:
gcc -c -mwindows -fexec-charset=gbk wingui.c
接下来,我们使用链接器将所有必需的模块链接到一起,生成最终的可执行文件:
ld c:\mingw\lib\crt2.0 wingui.o -Lc:\mingw\liv\cgg\mingw32\4.7.1 -lmingw32 -lmsvcrt --enable-stdcall-fixup c:\windows\system32\kernel32.dll c:\windows\system32\user\user32.dll c:\windows\system32\winmm.dll
注意,该程序不能播放MP3格式的文件,所以最好使用WAV格式的文件,如果找不到合适的文件,Windows目录下的系统声音也可以。
注意,如果要在windows中使用宽字符,则程序和他的转换过程都要有所改变。程序的改变如下,显然使用了宽字符版本的MessageBoxW函数:
#include<stdef.h>
typedef struck (int i;) stgHWND;
__stdcall int MessageBoxW (stgHWND *,const wchar_t *,\const wchar_t *,unsigned);
__stdcall int PlaySound(const char *,stgHWND *,unsigned long);
#define SND_FILENAME 0x20000
#define MV_OK 0
#define MB_ICONINFORMATION 64
int main(void)
{PlaySound("music.wav",0,SND_FILENAMEMessageBoxW (0,L"音乐播放完毕,请单击“确定”按钮退出当前程序。",L"WIN32 编程示例",MB_OK | MB_ICONINFORMATION);return 0;
}
在这里,MessageBoxW函数的第二个和第三个参数是指向宽字符串的指针,wchar_t类型是在头文件<stddef.h>中定义的。一旦在字面串的前面加了“L”,则是一个宽字面串,他意味着不是通常意义的元字符集到执行字符集的转换,而是从源字符集到宽执行字符集的转换,使用宽字符的编码方案。在这里我们应当指定UTF-16LE以适应Windows的宽字符编码要求,所以你可以在编译阶段使用一下命令:
gcc -c -mwindows -fwide-exec-chaset=UTF-16LE wingui.c
抄书(标准C语言指南)相关推荐
- 独立式环境与宿主式环境————《标准C语言指南》读书笔记01
独立式环境与宿主式环境----<标准C语言指南>读书笔记01 在编写和转换一个C程序之前,需要考虑它的执行环境,因为这关系到源文件的内容(程序应当如何编写),也关系到转换后的程序能否正常执 ...
- Protobuf3语言指南
参考文章:http://blog.csdn.net/u011518120/article/details/54604615 英文原文: Language Guide (proto3) 中文出处: ...
- GitHub上Swift语言指南
Swift 语言指南 @SwiftLanguage 更新于 2016-6-6,更新内容详见 Issue 55.往期更新回顾详见<收录周报> 这份指南汇集了 Swift 语言主流学习资源,并 ...
- Swift 语言指南
Swift 语言指南 @SwiftLanguage 更新于 2016-1-5,更新内容详见 Issue 43.往期更新回顾详见<收录周报> 这份指南汇集了 Swift 语言主流学习资源,并 ...
- 《国家智能制造标准体系建设指南(2018年版)》发布(附全文)
<国家智能制造标准体系建设指南(2018年版)>发布(附全文) [导读]工业和信息化部.国家标准化管理委员会日前印发<国家智能制造标准体系建设指南(2018年版)> ,明确提出 ...
- 【政策】《国家智能制造标准体系建设指南(2018年版)》印发
导 读 工业和信息化部.国家标准化管理委员会日前印发<国家智能制造标准体系建设指南(2018年版)>,明确提出到2018年,累计制修订150项以上智能制造标准,基本覆盖基础共性标准和关键技 ...
- poroto3 坑 枚举_Proto3 语言指南
由于工程项目中拟采用一种简便高效的数据交换格式,百度了一下发现除了采用 xml.JSON 还有 ProtoBuf(Google 出品),赶紧去瞄了一下.花了一个周末的时间把它走马观花的学习了一下,顺便 ...
- Swift语言指南(十)--字符串与字符
原文:Swift语言指南(十)--字符串与字符 字符串是一段字符的有序集合,如"hellow,world"或"信天翁".Swift 中的字符串由 String ...
- 基于标准C语言的数字图像处理基本框架(转)
考虑到现有的数字图像处理都是基于Windows平台,都或多或少使用了Win32 API函数,不能移植到Linux或者嵌入式系统中.为了使程序可移植,采用标准C语言建立了数字图像处理的基本框架,如下图所 ...
最新文章
- 极简数据分析实操指南(上)
- Ubuntu16.04+caffe+digits安装配置
- jMeter parallel controller 无法使用 CSV Data config 提供的变量?
- 【语义分割】OCRNet:Object-Context Representations for Semantic Segmentation
- 黑马程序员--里氏转换
- 全局替换安卓应用字体
- thinking in java(第七章)
- 图像增强总结-Retinex算法
- 支付宝”向他付款”,定额付款收款链接生成
- php数据库单循环显示,单循环赛制的PHP实现
- 浅谈SSM框架原理及使用
- RGB888与RGB565颜色对照表
- 【大数据面试题】(五)Spark 相关面试题总结
- 华安基金高管事发 基金业突遇“公信力寒流”(ZT)
- Apk 拆包替换文件
- 【敏捷】主要角色和分工
- java 终端窗口是什么,java程序如何打开命令行窗口?java程序怎么运行?
- 如何写好一篇毕业论文?
- Prometheus学习系列(十五)之预警规则
- 跨模态行人重识别:Hetero-Center Loss for Cross-Modality Person Re-Identification