day24:零基础学嵌入式之系统编程

一、系统编程包含

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

二、标准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;
}
#include <stdio.h>
int main(int argc, char **argv)
{
    if(argc <3)
    {
        printf("user:./a.out file1 file2");
        return 1;
    }
    FILE *src = fopen(argv[1], "r");
    FILE *des = fopen(argv[2], "w");
    if(NULL == src &&NULL == des)
    {
        fprintf(stderr, "fopen error");
        return 1;
    }
    while(1)
    {
        char buf[1024] = {0};
        if(NULL == fgets(buf, sizeof(buf), src))
        {
            break;
        }
        fputs(buf, des);
    }
    fclose(src);
    fclose(des);
    return 0;
}

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

#include <stdio.h>
int main(int argc, char **argv)
{
    char i ='a'; 
    for(i = 'a';i<='z';++i)
    {
        FILE *fp = fopen("/etc/passwd", "r");
        if(NULL == fp)
        {
            fprintf(stderr,"fopen error");
            return 1;
        }
        int counter = 0;
        while(1)
        {
            char c =fgetc(fp);
            if(EOF == c)
            {
                break;
            }
            if(i == c)
            {
                counter++;
            }
        }
        printf("%c :%d\n",i,counter);
        fclose(fp);
    }
   
    
    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进制打印
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值