iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么组织构建多文件C语言程序
  • 733
分享到

怎么组织构建多文件C语言程序

2023-06-16 14:06:59 733人浏览 安东尼
摘要

这篇文章主要讲解了“怎么组织构建多文件C语言程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么组织构建多文件C语言程序”吧!包含项目头文件位于第二部分中的 的源代码如下:...#inc

这篇文章主要讲解了“怎么组织构建多文件C语言程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么组织构建多文件C语言程序”吧!

包含项目头文件

位于第二部分中的 的源代码如下:

...#include "main.h"#include "mmecode.h"#include "mmdecode.h"

#include 是 C 语言的预处理命令,它会将该文件名的文件内容拷贝到当前文件中。如果程序员在头文件名称周围使用双引号(""),编译器将会在当前目录寻找该文件。如果文件被尖括号包围(<>),编译器将在一组预定义的目录中查找该文件。

main.h 文件中包含了 main.c 文件中用到的定义和类型定义。我喜欢尽可能多将声明放在头文件里,以便我在我的程序的其他位置使用这些定义。

头文件 mmencode.h 和 mmdecode.h 几乎相同,因此我以 mmencode.h 为例来分析。

  #ifndef _MMENCODE_H#define _MMENCODE_H  #include <stdio.h>  int mm_encode(FILE *src, FILE *dst);  #endif 

#ifdef#define#endif 指令统称为 “防护” 指令。其可以防止 C 编译器在一个文件中多次包含同一文件。如果编译器在一个文件中发现多个定义/原型/声明,它将会产生警告。因此这些防护措施是必要的。

在这些防护内部,只有两个东西:#include 指令和函数原型声明。我在这里包含了 stdio.h 头文件,以便于能在函数原型中使用 FILE 定义。函数原型也可以被包含在其他 C 文件中,以便于在文件的命名空间中创建它。你可以将每个文件视为一个独立的命名空间,其中的变量和函数不能被另一个文件中的函数或者变量使用。

编写头文件很复杂,并且在大型项目中很难管理它。不要忘记使用防护。

喵呜喵呜编码的最终实现

该程序的功能是按照字节进行 MeowMeow 字符串的编解码,事实上这是该项目中最简单的部分。截止目前我所做的工作便是支持允许在适当的位置调用此函数:解析命令行,确定要使用的操作,并打开将要操作的文件。下面的循环是编码的过程:

...   while (!feof(src)) {      if (!fgets(buf, sizeof(buf), src))       break;      for(i=0; i<strlen(buf); i++) {       lo = (buf[i] & 0x000f);       hi = (buf[i] & 0x00f0) >> 4;       fputs(tbl[hi], dst);       fputs(tbl[lo], dst);     }   }

简单的说,当文件中还有数据块时( feof(3) ),该循环读取(feof(3) )文件中的一个数据块。然后将读入的内容的每个字节分成两个 hilo半字节nibble。半字节是半个字节,即 4 个位。这里的奥妙之处在于可以用 4 个位来编码 16 个值。我将 hilo 用作 16 个字符串查找表 tbl索引,表中包含了用半字节编码的 MeowMeow 字符串。这些字符串使用 fputs(3) 函数写入目标 FILE 流,然后我们继续处理缓存区的下一个字节。

该表使用 table.h 中的宏定义进行初始化,在没有特殊原因(比如:要展示包含了另一个项目的本地头文件)时,我喜欢使用宏来进行初始化。我将在未来的文章中进一步探讨原因。

喵呜喵呜解码的实现

我承认在开始工作前花了一些时间。解码的循环与编码类似:读取 MeowMeow 字符串到缓冲区,将编码从字符串转换为字节

  ... int mm_decode(FILE *src, FILE *dst) {   if (!src || !dst) {     errno = EINVAL;     return -1;   }   return stupid_decode(src, dst); }

这不符合你的期望吗?

在这里,我通过外部公开的 mm_decode() 函数公开了 stupid_decode() 函数细节。我上面所说的“外部”是指在这个文件之外。因为 stupid_decode() 函数不在该头文件中,因此无法在其他文件中调用它。

当我们想发布一个可靠的公共接口时,有时候会这样做,但是我们还没有完全使用函数解决问题。在本例中,我编写了一个 I/O  密集型函数,该函数每次从源中读取 8 个字节,然后解码获得 1 个字节写入目标流中。较好的实现是一次处理多于 8  个字节的缓冲区。更好的实现还可以通过缓冲区输出字节,进而减少目标流中单字节的写入次数。

...int stupid_decode(FILE *src, FILE *dst){  char           buf[9];  decoded_byte_t byte;  int            i;      while (!feof(src)) {    if (!fgets(buf, sizeof(buf), src))      break;    byte.field.f0 = isupper(buf[0]);    byte.field.f1 = isupper(buf[1]);    byte.field.f2 = isupper(buf[2]);    byte.field.f3 = isupper(buf[3]);    byte.field.f4 = isupper(buf[4]);    byte.field.f5 = isupper(buf[5]);    byte.field.f6 = isupper(buf[6]);    byte.field.f7 = isupper(buf[7]);          fputc(byte.value, dst);  }  return 0;}

我并没有使用编码器中使用的位移方法,而是创建了一个名为 decoded_byte_t 的自定义数据结构

... typedef struct {  unsigned char f7:1;  unsigned char f6:1;  unsigned char f5:1;  unsigned char f4:1;  unsigned char f3:1;  unsigned char f2:1;  unsigned char f1:1;  unsigned char f0:1;} fields_t;  typedef uNIOn {  fields_t      field;  unsigned char value;} decoded_byte_t;

初次看到代码时可能会感到有点儿复杂,但不要放弃。decoded_byte_t 被定义为 fields_tunsigned char联合。可以将联合中的命名成员看作同一内存区域的别名。在这种情况下,valuefield 指向相同的 8 位内存区域。将 field.f0 设置为 1 也将会设置 value 中的最低有效位。

虽然 unsigned char 并不神秘,但是对 fields_t 的类型定义(typedef)也许看起来有些陌生。现代 C 编译器允许程序员在结构体中指定单个位字段的值。字段所在的类型是一个无符号整数类型,并在成员标识符后紧跟一个冒号和一个整数,该整数指定了位字段的长度。

这种数据结构使得按字段名称访问字节中的每个位变得简单,并可以通过联合中的 value 字段访问组合后的值。我们依赖编译器生成正确的移位指令来访问字段,这可以在调试时为你节省不少时间。

最后,因为 stupid_decode() 函数一次仅从源 FILE 流中读取 8 个字节,所以它效率并不高。通常我们尝试最小化读写次数,以提高性能和降低调用系统调用的开销。请记住:少量的读取/写入大的块比大量的读取/写入小的块好得多。

感谢各位的阅读,以上就是“怎么组织构建多文件C语言程序”的内容了,经过本文的学习后,相信大家对怎么组织构建多文件C语言程序这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么组织构建多文件C语言程序

本文链接: https://www.lsjlt.com/news/283897.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么组织构建多文件C语言程序
    这篇文章主要讲解了“怎么组织构建多文件C语言程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么组织构建多文件C语言程序”吧!包含项目头文件位于第二部分中的 的源代码如下:...#inc...
    99+
    2023-06-16
  • c语言怎么创建多个文件
    在C语言中,可以通过以下步骤来创建多个文件: 首先,打开一个文件,可以使用fopen函数来实现。例如: FILE *file1 ...
    99+
    2024-02-29
    c语言
  • c#语言程序构建基块
    目录1、成员2、辅助功能3、字段4、方法4.1参数4.2方法主体和局部变量4.3静态和实例方法4.4虚方法、重写方法和抽象方法4.5方法重载5、其他函数成员5.1构造函数5.2“属性...
    99+
    2024-04-02
  • c语言怎么把文件导入程序
    在C语言中,要把文件导入到程序中,你需要使用文件操作相关的函数。下面是一个简单的示例代码,展示了如何导入一个文本文件并打印文件内容:...
    99+
    2023-09-08
    c语言
  • c语言头文件怎么建立
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-21
  • python程序的组织结构是怎么样的
    这篇文章主要为大家展示了“python程序的组织结构是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python程序的组织结构是怎么样的”这篇文章吧。程序的组织结构顺序结构程序由上到下顺...
    99+
    2023-06-21
  • c语言怎么运行多个程序
    要在C语言中运行多个程序,可以使用多线程或者多进程的方式。 多线程: 可以使用pthread库来创建和管理多个线程。首先,需要包...
    99+
    2023-10-27
    c语言
  • c语言怎么建立一个文件
    在C语言中,可以使用文件指针和文件操作函数来建立一个文件。下面是一个简单的示例代码: #include int main() {...
    99+
    2023-10-28
    c语言
  • R语言rhdf5怎么读写hdf5并展示文件组织结构和索引数据
    这篇文章主要介绍“R语言rhdf5怎么读写hdf5并展示文件组织结构和索引数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“R语言rhdf5怎么读写hdf5并展示文件组织结构和索引数据”文章能帮助大...
    99+
    2023-07-02
  • C语言多维数组数据结构怎么实现
    这篇文章主要介绍“C语言多维数组数据结构怎么实现”,在日常操作中,相信很多人在C语言多维数组数据结构怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言多维数组数据结构怎么实现”的疑惑有所帮助!接下来...
    99+
    2023-06-25
  • C语言详细分析讲解多文件的程序设计
    目录一、多文件与编译器链接二、多文件之间的相互访问三、关于#include四、头文件使用的一些原则五、再论全局变量六、注意事项七、实验程序八、小结一、多文件与编译器链接 如下图所示,...
    99+
    2024-04-02
  • C语言多文件编程问题解析
    目录1 为什么要使用多文件编程2 多文件编程的使用方法3 多文件编程的练习1 为什么要使用多文件编程 在大型的综合项目中,是由很多具有不同的功能的代码构成,不可能将所有的代码都写到一...
    99+
    2022-12-27
    C语言多文件编程 C语言编程
  • R语言rhdf5读写hdf5并展示文件组织结构和索引数据
    前言 h5只是一种简单的数据组织格式【层级数据存储格式(HierarchicalDataFormat:HDF)】,该格式被设计用以存储和组织大量数据。 在一些单细胞文献中,作者通常...
    99+
    2024-04-02
  • C语言中的程序结构是什么
    这篇文章主要介绍“C语言中的程序结构是什么”,在日常操作中,相信很多人在C语言中的程序结构是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中的程序结构是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-08
  • C#怎么利用资源文件开发一个多种语言版本的程序
    这篇文章主要讲解了“C#怎么利用资源文件开发一个多种语言版本的程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么利用资源文件开发一个多种语言版本的程序”吧!C#语言还是比较常见的东西...
    99+
    2023-06-17
  • 怎么在C语言中使用多维数组和结构体
    本篇内容介绍了“怎么在C语言中使用多维数组和结构体”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!题目:有一个颜色集合,里面有若干个颜色值(R...
    99+
    2023-06-08
  • C语言数据结构顺序表怎么构造
    本篇内容介绍了“C语言数据结构顺序表怎么构造”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言在学习链表之前先掌握顺序表什么是顺序表?顺序表...
    99+
    2023-06-30
  • c语言编程软件怎么调中文
    c++kquote>visual studio code、code::blocks、dev-c++、eclipse ide 和 qt creator 均可切换为中文。步骤如下:vi...
    99+
    2024-04-05
    c语言 c++ c语言编程
  • c语言怎么输入多组数据
    在 C 语言中,输入多组数据可以通过使用循环结构来实现。以下是一个示例代码,演示了如何输入多组数据: #include <st...
    99+
    2024-04-02
  • 怎么编译C语言程序
    这篇文章主要介绍了怎么编译C语言程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么编译C语言程序文章都会有所收获,下面我们一起来看看吧。编译/执行 C 程序实例#include <stdio.h>...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作