嵌入式开发:IO进程 标准IO

标准IO

1.概念

C库中定义的一组用于输入输出的函数接口

2.特点

(1)通过缓冲机制减少系统调用,提高效率

(2)围绕流进行操作,流用FILE *表示

(3)标准IO默认打开了三个流,stdin(标准输入)、stdout(标准输出)、stderr(标准错误)

(4)只能操作普通文件

ctags索引的使用:

1.vi -t 要查找的内容(查找宏,结构体,数据类型等)

2.继续追踪

光标定位在要追溯内容 Ctrl+]

后退 Ctrl+t

3.缓冲区

1.全缓冲:跟文件相关

刷新缓冲区的方法:

程序正常运行结束退出

缓冲区满

强制刷新fflush

2.行缓冲:跟终端相关

刷新缓冲区的方法:

\n 换行

程序正常运行结束退出

缓冲区满

强制刷新fflush

3.不缓冲:没有缓冲区,标准错误

#include
int main(int argc, char const *argv[])
{
 
//1.\换行刷新缓冲区
printf("hello world\n");
while(1);
//2.程序正常运行结束
printf("hello world");
//3.缓冲区满
//方法一:
for(int i=0;i<200;i++)
{
    printf("%4d",i);
}
while (1)
//方法二:
printf("buf:\n");
printf("%d\n",stdout->_IO_buf_end-stdout->_IO_buf_base);
//4.强制刷新fflush
printf("hello world");
fflush(NULL);
while (1)
//标准错误不是缓冲
perror("hello world");
while(1)
    ;
    return 0;
}

函数

1.打开文件fopen

 嵌入式开发:IO进程 标准IO_第1张图片

 r:只读,当文件不存在时报错,文件流定位到文件开头

r+:可读可写,当文件不存在时报错,文件流定位到文件开头

w:只写,文件不存在时创建,存在则清空

w+:可读可写,文件不存在时创建,存在则清空

a:追加(在末尾写),文件不存在时创建,存在时追加,文件流定位到文件末尾

a+:可读可追加,文件不存在时创建,存在时追加,读文件流定位到开头,写文件流定位到末尾

ps:当以a方式打开文件时,写只能在末尾进行追加,定位操作是无法改变写的位置,但是可以改变读的位置

返回值:成功:文件流

失败:NULL,并设置错误码

#include
int main(int argc, char const *argv[])
{
    FILE *fp = fopen("1.txt","w");
    if(NULL == fp)
    {
        perror("fopen fp error!");
        return -1;
    }
    printf("fopen success\n");
    return 0;
    fclose(fp);
}

2.关闭文件close

 3.读写操作

每次读写一个字符fgetc fputc

1.fgetc 从文件中读取一个字符

 返回值:成功:返回读到的字符

失败或读到文件末尾:EOF(-1)

#include 
int main(int argc, char const *argv[])
{
    FILE *fp = fopen("a.txt", "r+");
    if (NULL == fp)
    {
        perror("fopen fp error\n");
        return -1;
    }
    printf("fopen success\n");
    int ch = fgetc(fp);
    printf("%d\n", ch);
    printf("%c\n", ch);
    fclose(fp);
    return 0;
}

2.fputc向文件中写入一个字符

 返回值:成功:返回写的字符的ASCII码

失败:EOF

#include
#include
int main(int argc, char const *argv[])
{
    char buf[32] = {0};
    int a = fgetc(stdin);
    fputc(a,stdout);
    return 0;
}

3.判断有无字符feof

功能:判断当前所在位置后面还有没有字符

返回值:成功:后面没有字符会返回一个非0值

失败:后面还有字符会返回0

4.判断是否出错ferror

功能:判断是否出错

返回值:成功:程序出错会返回一个非0值

失败:程序未出错会返回0

 例:利用fgetc fputc实现cat命令功能

//1.打开文件
//2.循环读取
//3.输出到终端
//4.关闭文件
#include 
int main(int argc, char const *argv[])
{
    char ch;
    FILE *fp = fopen(argv[1],"r+");
    if(NULL == fp)
    {
        perror("fopen fp error");
        return -1;
    }
    printf("fopen sucess\n");
    while(1)
    {
        ch = fgetc(fp);
        if(feof(fp))
        break;
        fputc(ch,stdout);
    }
    fclose(fp);
    putchar(10);
    return 0;
}

5.每次读一串字符fgets

 

 读到哪,读多少个,从哪里读

功能:从文件中每次读取一行字符

返回值:成功:存放字符串的地址

失败或读到文件末尾:NULL

6.每次写一串字符fputs

 功能:向文件中写字符

返回值:成功:非负整数

失败:EOF

#include 
#include 
int main(int argc, char const *argv[])
{
    char ch[32] = {0};
    FILE *fp = fopen("1.txt", "r+");
    if(NULL == fp)
    {
        perror("fopen error");
        return -1;
    }
    printf("fopen success\n");
    fgets(ch,sizeof(ch),fp);
    fputs(ch,stdout);
    putchar(10);
    fclose(fp);
    return 0;
}

例:通过fgets实现 wc -l 文件名 命令功能

#include 
#include 
int main(int argc, char const *argv[])
{
    char buf[32];
    int len = 0;
    FILE *fp = fopen("1.txt", "r");
    if (NULL == fp)
    {
        perror("fopen error");
        return -1;
    }
    printf("fopen success\n");
    while (fgets(buf, 32, fp) != NULL)
    {
        if (buf[strlen(buf) - 1] == '\n')
            len++;
    }
    printf("%d\n", len);
    return 0;
}

7.二进制读写fread fwrite

嵌入式开发:IO进程 标准IO_第2张图片

 功能:从文件流读取多个元素

fread返回值:成功:读取的元素个数

读到文件尾:0     失败:-1

fwrite返回值:成功:写的元素个数

              失败 :-1

#include 
int main(int argc, char const *argv[])
{

    FILE *fp = fopen("1.txt", "w+");
    if (NULL == fp)
    {
        perror("fopen error");
        return -1;
    }
    printf("fopen success\n");
    float arr[3] = {1.23, 4.56, 7.89};
    float src[3] = {0};
    fwrite(arr, sizeof(float), 3, fp);
    rewind(fp); //将文件指针定位到开头
    fread(src, sizeof(float), 3, fp);
    for (int i = 0; i < 3; i++)
        printf("%.2f ", src[i]);
    putchar(10);
    fclose(fp);
    return 0;
}

4.文件定位操作

1.rewind

功能:将文件位置指针定位到起始位置

 2.fseek

 返回值:成功:0

失败-1

int whence参数:

SEEK_SET:定位到起始位置

SEEK_CUR:定位到当前位置

SEEK_END:定位到末尾

3.ftell

功能:获取当前在文件中的位置

 返回值:成功:当前在文件中的位置

失败:-1

例:用标准IO实现CP命令

#include
int main(int argc, char const *argv[])
{
    char ch[32] = {0};
    FILE *fp = fopen("a.txt","r");
    if(NULL == fp)
    {
        perror("fopen fp error");
        return -1;
    }
    printf("fopen fp success\n");
    FILE *fp2 = fopen("1.txt","w");
    if(NULL == fp2)
    {
        perror("fopen fp2 error");
        return -1;
    }
    printf("fopen fp2 success\n");
    while (1)
    {
        fgets(ch,32,fp);
        fputs(ch,fp2);
        if(feof(fp))
        break;
    }
    
    
    return 0;
}

你可能感兴趣的:(开发语言,linux,c语言,visual,studio,code)