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语言指南)相关推荐

  1. 独立式环境与宿主式环境————《标准C语言指南》读书笔记01

    独立式环境与宿主式环境----<标准C语言指南>读书笔记01 在编写和转换一个C程序之前,需要考虑它的执行环境,因为这关系到源文件的内容(程序应当如何编写),也关系到转换后的程序能否正常执 ...

  2. Protobuf3语言指南

    参考文章:http://blog.csdn.net/u011518120/article/details/54604615 英文原文:  Language Guide (proto3)  中文出处:  ...

  3. GitHub上Swift语言指南

    Swift 语言指南 @SwiftLanguage 更新于 2016-6-6,更新内容详见 Issue 55.往期更新回顾详见<收录周报> 这份指南汇集了 Swift 语言主流学习资源,并 ...

  4. Swift 语言指南

    Swift 语言指南 @SwiftLanguage 更新于 2016-1-5,更新内容详见 Issue 43.往期更新回顾详见<收录周报> 这份指南汇集了 Swift 语言主流学习资源,并 ...

  5. 《国家智能制造标准体系建设指南(2018年版)》发布(附全文)

    <国家智能制造标准体系建设指南(2018年版)>发布(附全文) [导读]工业和信息化部.国家标准化管理委员会日前印发<国家智能制造标准体系建设指南(2018年版)> ,明确提出 ...

  6. 【政策】《国家智能制造标准体系建设指南(2018年版)》印发

    导 读 工业和信息化部.国家标准化管理委员会日前印发<国家智能制造标准体系建设指南(2018年版)>,明确提出到2018年,累计制修订150项以上智能制造标准,基本覆盖基础共性标准和关键技 ...

  7. poroto3 坑 枚举_Proto3 语言指南

    由于工程项目中拟采用一种简便高效的数据交换格式,百度了一下发现除了采用 xml.JSON 还有 ProtoBuf(Google 出品),赶紧去瞄了一下.花了一个周末的时间把它走马观花的学习了一下,顺便 ...

  8. Swift语言指南(十)--字符串与字符

    原文:Swift语言指南(十)--字符串与字符 字符串是一段字符的有序集合,如"hellow,world"或"信天翁".Swift 中的字符串由 String ...

  9. 基于标准C语言的数字图像处理基本框架(转)

    考虑到现有的数字图像处理都是基于Windows平台,都或多或少使用了Win32 API函数,不能移植到Linux或者嵌入式系统中.为了使程序可移植,采用标准C语言建立了数字图像处理的基本框架,如下图所 ...

最新文章

  1. 极简数据分析实操指南(上)
  2. Ubuntu16.04+caffe+digits安装配置
  3. jMeter parallel controller 无法使用 CSV Data config 提供的变量?
  4. 【语义分割】OCRNet:Object-Context Representations for Semantic Segmentation
  5. 黑马程序员--里氏转换
  6. 全局替换安卓应用字体
  7. thinking in java(第七章)
  8. 图像增强总结-Retinex算法
  9. 支付宝”向他付款”,定额付款收款链接生成
  10. php数据库单循环显示,单循环赛制的PHP实现
  11. 浅谈SSM框架原理及使用
  12. RGB888与RGB565颜色对照表
  13. 【大数据面试题】(五)Spark 相关面试题总结
  14. 华安基金高管事发 基金业突遇“公信力寒流”(ZT)
  15. Apk 拆包替换文件
  16. 【敏捷】主要角色和分工
  17. java 终端窗口是什么,java程序如何打开命令行窗口?java程序怎么运行?
  18. 如何写好一篇毕业论文?
  19. Prometheus学习系列(十五)之预警规则
  20. 跨模态行人重识别:Hetero-Center Loss for Cross-Modality Person Re-Identification

热门文章

  1. swift5 Notification
  2. 物联网架构实例—框架设计
  3. Openssl生成自签名证书并导入浏览器脚本
  4. linux+n天没有访问文件夹,linux文件目录与管理
  5. 笔记:表单验证以及sweetalert中swal的使用
  6. 设计的7条心理学原则和定律
  7. 移动互联网产品设计的原则
  8. java语言计算圆周率_Java语言简单计算圆周率完整示例
  9. day2-MySQL规约
  10. Vue中如何进行屏幕录制与直播推流