`

CTDP linux 程序员手册 C和C++编程(11)Viewmod程序

阅读更多
大家可以通过这个例子体会linux的c编程。
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#define _POSIX_SOURCE 1 //POSIX 兼容源码
#define FALSE 0
#define TRUE 1
#define MAX_DEVICES 64
#define MAX_IDS 64
#define LINE_LENGTH 1128
FILE *output;
char input_fname[80]; //打印机的文件名称
FILE *input_file;
mode_t mode;
char Char; //用于单个char的处理
int display; //"-D" 项: 0-ASC,1-ASC/HEX, 2-Hex 3-dec 4-dec/asc 5-DOS text 6-UNIX text 7- strip all non-asc
int out_length;//-L 选项
int display_col; //显示列计数
int char_len;
int asc_char; //0-non-asc, 1-asc, 2-CR, 3-LF
int nospace;
int last_char; //最后一个 char的类型
int get_linestring(char *file_line, char *label_name, int qty_statements, int strno);
int freadln(FILE *handle,char *outputline);//从一个文件读一行
void Process_Bufchar(); //一次处理一个在缓存中的Char
main(int Parm_Count, char *Parms[])
{
 char message[90];
 int start_options, in_source, done;
 char *lastslash; //最后一个slash 的字符串地址
 char dirname[80]; //目录名称
 DIR *current_directory;
 int i;
 char In1, Key;
 char buf[255]; //数据缓存
 out_length = 80;
 display = 1;//缺省值 HEX/ASC 显示, 在CR, CR/LF, LF后断开
 start_options=0;
 in_source = 0; //缺省值,便准输出
 if (Parm_Count>1)//在程序名后面如果有参数
 {
 start_options = 1;
 strcpy(message,Parms[1]);
 if (message[0]!='-')//如果是一个输入文件的名称
 {
 if ((input_file = fopen(Parms[1], "rb")) == NULL)
 {
 fprintf(stderr,"%s: Unable to open the input file %s\n",Parms[0],Parms[1]);
 exit(1); //发生错误退出
 }
 else
 {
 in_source = 1;//file
 }
 }//end 如果是一个输入文件
 }//end在程序名后面如果有参数
 //获得参数
 if (start_options<Parm_Count)//如果开始选项存在
 {
 for (i=1; i<Parm_Count; i++)
 {
 strcpy(message, Parms[i]);
 if (message[0]=='-')
 {
 if ((message[1]=='D') || (message[1]=='d'))//if display option
 {
 if (message[2]=='0') display=0;
 if (message[2]=='1') display=1;
 if (message[2]=='2') display=2;
 if (message[2]=='3') display=3;
 if (message[2]=='4') display=4;
 if (message[2]=='5') display=5;
 if (message[2]=='6') display=6;
 if (message[2]=='7') display=7;
 }
 if ((message[1]=='L') || (message[1]=='l'))//如果有 length选项
 {
 out_length=atoi(&message[2]);
 }
 }
 }
 }//end如果开始选项存在
 done = 0;
 display_col=0;
 nospace = 1;//我们不需要space
 last_char=4;
 while (!done)
 {
 if (in_source==1) //从文件读一个字符
 {
 if ((Char=fgetc(input_file))==EOF)
  {
 done = 1;
 }
 }
 else //从标准输入读一个字符
 {
 Char=getchar();
 if (Char==EOF)
 {
 done = 1;
 }
 }
 if (done==0) //输出这个字符到标准输出
 {
 asc_char=0; //假设不是 asc 字符
 if ((Char>31) && (Char < 127)) asc_char = 1;
 if (Char==13) asc_char = 2;
 if (Char==10) asc_char = 3;
  switch (display)
 {
 case 0: //ASC
 if (asc_char < 2) char_len=1;
 else char_len=0;
 if (display_col+char_len>out_length)
 {
 putchar(10);//如果此行太长滚动
 display_col=0;
 }
 putchar(Char);
  display_col++;
 if (asc_char==3) display_col=0;
 break;
 case 1: //ASC/HEX
 default:
 if (asc_char==1) char_len=1;
 else char_len=2;
 if ((display_col==0) || (last_char==4) || ((last_char==1) && (asc_char==1)))nospace=1;//dont need space
 else nospace=0;
 if (nospace==0) char_len++;//如果我们需要一个 space
 if (display_col+char_len>out_length)
 {
 putchar(10);//如果此行太长滚动
 display_col=0;
 if (nospace==0)
 {
 nospace=1;
 char_len--;
 }
 }
 if (nospace==0)//加一个 space
 {
 putchar(' ');
 display_col++;
 }
 if (asc_char==1)
 {
 putchar(Char);
 display_col++;
 }
 else
 {
 sprintf(message,"%2x",Char);
 fputs(message,stdout);
 display_col +=2;
 if (asc_char==3)
 {
 putchar(10);
 display_col=0;
 }
 }
 if ((last_char==2) && (asc_char!=3))//如果有 CR 没有 LF
 {
 putchar(10);
 display_col=0;
 }

 last_char=asc_char;
 break;
 case 2: //hex
 char_len=2;
 if (display_col==0) nospace = 1;
 else nospace = 0;
 if (nospace == 0) char_len++; //如果我们需要一个 space
 if (display_col+char_len>out_length)
 {
 putchar(10);//如果此行太长滚动
 display_col=0;
 if (nospace==0)
 {
 nospace=1;
 char_len--;
 }
 }
 if (nospace==0)//添加space
 {
 putchar(' ');
 display_col++;
 }
 sprintf(message,"%2x",Char);
 fputs(message,stdout);
 display_col +=2;
 break;
 case 5: //unix 文本 – 调整dos文本,在所有LF加CR 
 if (Char==10) putchar(13);
 putchar(Char);
 break;
 case 6: //dos 文本 – 到 unix, 跳过所有CR
 if ((last_char==2) && (asc_char !=3))putchar(10); //if this char is not a LF and the last one was CR, need a line feed for unix
 if (Char!=13) putchar(Char);
 last_char=asc_char;
 break;
 case 3: //decimal
 char_len=3;
 if (display_col==0) nospace = 1;
 else nospace = 0;
 if (nospace == 0) char_len++; //如果我们需要一个 space
 if (display_col+char_len>out_length)
 {
 putchar(10);//如果此行太长滚动
 display_col=0;
 if (nospace==0)
 {
 nospace=1;
 char_len--;
 }
 }
 if (nospace==0)//添加一个 space
 {
 putchar(' ');
 display_col++;
 }
 sprintf(message,"%3d",Char);
 fputs(message,stdout);
 display_col +=2;
 break;
 case 4: //decimal asc
 if (asc_char==1) char_len=1;
 else char_len=3;
 if ((display_col==0) || (last_char==4) || ((last_char==1) && (asc_char==1)))nospace=1;//dont need space
 else nospace=0;
 if (nospace==0) char_len++;//如果我们需要一个space
 if (display_col+char_len>out_length)
 {
 putchar(10);//如果此行太长滚动
 display_col=0;
 if (nospace==0)
 {
 nospace=1;
 char_len--;
 }
 }
 if (nospace==0)//add a space
 {
 putchar(' ');
 display_col++;
 }
 if (asc_char==1)
 {
 putchar(Char);
 display_col++;
 }
 else
 {
 sprintf(message,"%3d",Char);
 fputs(message,stdout);
 display_col +=2;
 if (asc_char==3)
 {
 putchar(10);
 display_col=0;
 }
 }
 if ((last_char==2) && (asc_char!=3))//如果有 CR 没有 LF
 {
 putchar(10);
 display_col=0;
 }
 last_char=asc_char;
 break;
 case 7: //跳过所有得 non-asc 字符转到 Unix 文件 (除了ASC 和 LF)
 if ((asc_char==1) || (asc_char==3)) putchar(Char);
 break;
 }//end of switch display
 }//end of if not done
 }//end of while not done
}//end of main


  


  
分享到:
评论

相关推荐

    python爬虫数据可视化-10-where条件语句-模糊查询.ev4.rar

    python爬虫数据可视化-10-where条件语句-模糊查询.ev4.rar

    train.csv

    train

    Golang(Gin框架)+websocket 实现的多人聊天室+代码+详细文档

    Golang(Gin框架)+websocket 实现的多人聊天室+代码+详细文档

    用于艾默生、维蒂APM300等UPS主机管理设置软件

    用于艾默生、维蒂APM300等UPS主机管理设置软件

    flink样例完整代码

    flink样例完整代码

    基于Java的养牛知识小程序源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    XCOM V2.0.zip

    XCOM V2.0.zip

    基于stl_pg版本实现自己的stl库C++源码.zip

    【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip基于stl_pg版本实现自己的stl库C++源码.zip

    基于Java的大学生竞赛平台的设计与开发源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    经纬度距离计算器,是一款帮助用户计算2点之间的直线距离的小工具

    经纬度距离计算器,是一款帮助用户计算2点之间的直线距离的小工具。 当我们的日常生活中,或者工作中需要通过2点之间经纬度计算距离时,就可以使用这个工具了 此工具不用按照.zip

    基于python的运动员数据分析源码.zip

    基于python的运动员数据分析源码.zip 基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip基于python的运动员数据分析源码.zip

    cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于易安卓打造的蓝牙开关,手机和蓝牙模块通信

    安卓期末大作业题目 易安卓编写的,说编写其实我只是修改了其中的一些内容,主要的部分都是易锦老师视频里的那个软件,不过我已经懂得了那些命令,(后面有工程文件,如果不 懂,可以去找易锦老师的视频来看,如果找不到,我这存的有),两张界面和代码截图,非常简单,功能也很简单,程序前后修改了两次主要地方,主要原因是测试 的时候发现第一种程序会出现错误,在单片机哪里会仔细说明! 操作界面,很简单,打开之后打开蓝牙,然后点击搜索设备,找到你的模块名字,点击之后就可以连接了,连接之后下面会显示蓝牙的名称和地址信息

    Java开发案例-springboot-35-整合TLog实现分布式日志标记追踪-源代码+文档.rar

    Java开发案例-springboot-35-整合TLog实现分布式日志标记追踪-源代码+文档.rar Java开发案例-springboot-35-整合TLog实现分布式日志标记追踪-源代码+文档.rar Java开发案例-springboot-35-整合TLog实现分布式日志标记追踪-源代码+文档.rar Java开发案例-springboot-35-整合TLog实现分布式日志标记追踪-源代码+文档.rar Java开发案例-springboot-35-整合TLog实现分布式日志标记追踪-源代码+文档.rar Java开发案例-springboot-35-整合TLog实现分布式日志标记追踪-源代码+文档.rar

    MATLAB是一种高级的编程语言和交互式环境

    matlab仿真

    南京邮电大学实验作业之民航票务管理系统+源码

    南京邮电大学c 实验2 南京邮电大学实验作业之民航票务管理系统+源码 南京邮电大学实验作业之民航票务管理系统+源码 南京邮电大学实验作业之民航票务管理系统+源码 Date类 判断日期格式 Flight类 Add Delete Set Find 晚点 UI Login Admin user Sort 票务管理 退票 订票 取票 诚信系统 用户账户系统

    基于Java的宠物交易平台源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    nginx-flv-windows

    集成了nginx-http-flv-module。 利用笔记本本地摄像头,通过 ffmpeg +nginx 实现rtmp推流, 得到flv流地址可用

    mmexport1717129884184.jpg

    mmexport1717129884184.jpg

    基于Java的海南自贸港知识学习与测试源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

Global site tag (gtag.js) - Google Analytics