当前位置: 首页 > news >正文

嵌入式LINUX—————系统编程

一、系统编程包含


文件的读写、和常用操作,
操作系统已经进入多任务时代,在同一时刻同时运行多个程序。

二、标准io;stdio.h(以计算机为中心)

        1.头文件路径:/usr/include/stdio.h

        so动态库:stdio.c=>libc.so:gcc的前三步,so文件已经是二进制,也叫c库文件,调用系统级别的头文件,传入的是so动态库,路径在:usr/lib

        ldd  ./a.out:

        2.man手册

        (1)man  man  ==>所有man的帮助
man  xxx == man 1 xxx ===>查看当前xxx命令
man 2 xxx  ===>查看xxx对应的系统调用函数
man 3 xxx  ===》查看xxx对应的标准库函数

        (2)总路径:/usr/share/man

三、文件

1.基本信息

(1)作用:linux中一切都是文件。文件用来存储数据(数据,指令);

(2)文件io,系统调用,底层软件
1)文件内容的分类, 文本文件,二进制文件     
struct FILE
{
}
流:   FILE*
数据从文件当中流入和流出所体现出来的字节

        2)流的分类:

                二进制流: 2001 \n;二进制数据的流
文本流:ASCII码数据的流 \n \t 
FILE 结构定义的对象 FILE * 称之为流对象,也叫文件流指针。
流对象 ===》头 《===数据====》尾

2.步骤   “打开读写关闭”

         打开文件FILE
io操作,读写操作
关闭文件

3.文件io,系统调用,底层软件

(1)文件内容的分类, 文本文件,二进制文件     
struct FILE
{
}
流:   FILE*
数据从文件当中流入和流出所体现出来的字节

(2)流的分类:

        1)二进制流: 2001 \n;二进制数据的流
2)文本流:ASCII码数据的流 \n \t 
FILE 结构定义的对象 FILE * 称之为流对象,也叫文件流指针。
流对象 ===》头 《===数据====》尾

3.FILE* = fopen:

        FILE是文件流指针,描述文件相关信息,打开之后,只关心文件的内容,FILE结构体内部有个成员指向文件的文本;

4. 读写操作相关

        fgetc/fputc,,,,,,一个字符,
fgetc(int c ,FILE*strem);
fgets/fputs....,,一次一行(最常用)
fread/fwrite....自定义大小,,二进制

5.fopen函数:FILE *fopen(const char *path, const char *mode);

(1)功能:打开一个文件并建立一个流

(2)参数解释

        1)path:

        要打开文件的路径
2)mode:

        r 只读:文件不存在报错,文件存在则只读打开(要在文件已存在的情况操作)
r+ 读写:文件不存在报错,文件存在则读写打开(要在文件已存在的情况操作)
w 只写:文件不存在,则创建文件存在则清0只写打开
w+ 写读:文件不存在则创建,文件存在则清0写读打开
a 追加可写:文件不存在则创建,文件存在则追加只写打开
a+ 追加读写:文件不存在则创建,文件存在则追加读写打开
返回值:成功返回建立的文件流指针,失败返回NULL

6.fputc函数:int fputc(int c, FILE *stream);

(1)功能 : 向流中写入一个字符
(2)参数 :
1)c:要写入的字符
2)stream:文件流指针
3)返回值 : 成功返回写入的字符ASCII码值,失败返回EOF(end o)

#include <stdio.h>int    main(int argc, char **argv)
{FILE * fp = fopen("01.txt", "w");if(NULL==fp){fprintf(stderr, "FILE fopen error");return 1;}fputc('h', fp);fputc('e', fp);fputc('l', fp);fputc('l', fp);fputc('o', fp);fputs("hello", fp);fputc('\n', fp);fclose(fp);return 0;
}
7.fgetc:int fgetc(FILE *stream)

(1)功能:从流中读取一个字符
(2)参数:stream:文件流指针
(3)返回值:成功返回读到字符的ASCII码值,读到文件末尾返回EOF,失败返回EOF 

#include <stdio.h>
int    main(int argc, char **argv)
{FILE* fp =fopen("01.txt", "r");if(NULL==fp){fprintf(stderr, "FILE fopen error");return 1;}while(1){int c  = fgetc(fp);if(EOF == c){break;}printf("%c ",c);}fclose(fp);return 0;
}

vimdiff 文件名1 文件名2(文本对照工具)

8.fgets:fgets(buff, sizeof(buff), stdin);

(1)功能:从stream流对象关联的文件中获取size大小字节的文本数据并存储到s对应的本地内存(栈区数组,堆区内存)
(2)参数: s 要存储数据的本地内存; size 要获取的数据长度,单位字节; stream 要获取的目标文件流对象,可以是stdin ,程序会阻塞等待,如果是普通文件fp 则指向文件第一行数据
(3)返回值:成功 返回指向有效数据的首地址,一般等于s的地址,失败 或者 文件末尾 NULL;

#include <stdio.h>
int    main(int argc, char **argv)
{if(argc < 2){printf("user:./a.out file");return 1;}FILE *fp = fopen(argv[1], "r");if(NULL==fp){fprintf(stderr, "FILE fopen error");return 1;}while(1){char buf[1024];if(NULL == fgets(buf, sizeof(buf), fp)){break;}printf("%s",buf);}fclose(fp);return 0;
}

(3)gets和fgets的区别:
1)gets是危险的,因为没有规范读到数据的上限
2)gets会去掉从终端读入的\n字符
3)fgets会读到n个数据,如果n个 数据中存在\n字符则立即停止当前的读取操作
4)fgets不会去掉从流中读到的\n字符

        注意:读到的是size -1个

9.fputs:int fputc(int c, FILE *stream);

(1)功能:向流中写入一个字符
(2)参数:
1)c:要写入的字符
2)stream:文件流指针
3)返回值:成功返回写入的字符ASCII码值,失败返回EOF

#include <stdio.h>
int    main(int argc, char **argv)
{FILE *fp = fopen("05.txt", "w");char buf[][100] ={"hello","world","china"};for (int i = 0; i < 3; i++){fputs(buf[i], fp);} fclose(fp);return 0;
}
10.练习

(1)cp

#include <stdio.h>
int    main(int argc, char **argv)
{FILE *src = fopen(argv[1], "r");FILE *dest = fopen(argv[2],"w");if(NULL==src){fprintf(stderr, "FILE fopen error");return 1;}if(NULL==dest){fprintf(stderr, "FILE fopen error");return 1;}while (1){int c= fgetc(src);if(EOF == c)    {break;} fputc(c,dest);} fclose(src);   fclose(dest);return 0;
}


(2)对一个文件的a-z统计个数

#include <stdio.h>
int    main(int argc, char **argv)
{FILE *src = fopen(argv[1], "r");FILE *dest = fopen(argv[2],"w");if(NULL==src){fprintf(stderr, "FILE fopen error");return 1;}if(NULL==dest){fprintf(stderr, "FILE fopen error");return 1;}while (1){int c= fgetc(src);if(EOF == c)    {break;} fputc(c,dest);} fclose(src);   fclose(dest);return 0;
}

(3)对一个文件统计行数

#include <stdio.h>
int main(int argc, char **argv)
{FILE *fp = fopen("/etc/passwd", "r");if(NULL == fp){fprintf(stderr,"fopen error");return 1;}int counter = 0;while(1){char buf[1024] = {0};if(NULL == fgets(buf, sizeof(buf), fp)){break;}counter++;}printf("%d\n",counter);fclose(fp);return 0;
}
11.main后面的两个参数

(1)argc:参数的意思,命令行参数的个数有几个;char *argv:就是./a.out 后面写的

        od -c命令:以字符方式打印,后面加文件
od -t x1 命令:以16进制打印

http://www.dtcms.com/a/322175.html

相关文章:

  • Javascript中的一些常见设计模式
  • 小程序中使用echarts(2025/8/8)
  • 最近看到的提示词相关内容汇总
  • Document Picture-in-Picture API拥抱全新浮窗体验[参考:window.open]
  • K-Means 聚类
  • 液体泄漏识别误报率↓76%:陌讯多模态融合算法实战解析
  • 94、【OS】【Nuttx】【构建】cmake 配置介绍
  • 【Linux】Linux增删改查命令大全(附频率评级)
  • 批量将NC格式数据转换为TIF格式:解决转换后图像颠倒、镜像、翻转等问题
  • 深度剖析主流AI大模型的编程语言与架构选择:行业实践与技术细节解读
  • Uipath Studio中爬取网页信息
  • 安装CST时,报错问题处理
  • 几个概率分布在机器学习应用示例
  • Java-反射
  • C++编程之旅-- -- --类与对象的奇幻征途之初识篇(一)(了解类的基本用法,计算类大小,分析this指针)
  • 【完整源码+数据集+部署教程】海洋物体实例分割系统源码和数据集:改进yolo11-EfficientHead
  • Java【问题 07】SSH不同版本使用jsch问题处理(7.4升级9.7及欧拉原生8.8)
  • WD5202 非隔离降压转换芯片,220V降5V,输出电流80MA
  • Java学习Collection单列集合中的三种通用遍历方法
  • 【Erdas实验教程】029:遥感图像光谱增强(缨帽变换)
  • 经济学从业者职业发展认证体系分析
  • 在 Git 中,将本地分支的修改提交到主分支
  • 数据结构--哈希表与排序、选择算法
  • PVE 9.0 保姆级安装及优化教程(换源、网络配置、远程唤醒等)【基础篇】
  • 农行鉴权问题
  • 嵌入式 Linux 驱动开发常见问题排查宝典(驱动开发篇)v1.0
  • “人工”智能究竟需要多少人工?
  • 《设计模式之禅》笔记摘录 - 14.组合模式
  • 使用Python+selenium实现第一个自动化测试脚本
  • 【GPT-OSS 全面测评】释放推理、部署和自主掌控的 AI 新纪元