首页 > 系统相关 >io进程----标准io

io进程----标准io

时间:2024-08-23 21:25:06浏览次数:5  
标签:fp 文件 FILE int ---- io 进程 include buf

大纲

IO:input,output
          标准IO   文件IO   文件属性获取    目录操作    库(动态库,静态库)

进程:process(程序执行的过程)
          进程基础,线程(同步,互斥,条件变量),进程间通信(无名管道pipe,有名管道fifo,信号signal,共享内存shared memory,信号灯集semphore set,消息队列message queue)

一丶标准IO

1.概念

        标准io:在C库中定义的一组专门用于输入输出的函数

2.特点

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

      例如:从硬盘中读1KB文件,每次只能读1B,循环读1024次。
      补充:系统调用:内核向上提供的一组接口
(2).围绕流进行操作,流用FILE*来描述,FILE代表的是结构体,描述所操作文件的信息

vi编辑器:

vscode编辑器:
    跳转到定义:ctrl 左键
    前后跳转:
   ctrl alt -
   ctrl shift -
(3).默认打开了三个流:stdin(标准输入)、stdout(标准输出)、stderr(标准错误)

3.缓存区

(1).全缓存:和文件相关
(2).行缓存:和终端相关
   刷新缓存的条件:
            1)  程序正常退出
            2)  缓存区满刷新
            3)  强制刷新fflush
            4) \n在printf中不仅是换行,也是刷新标准输出缓存区的条件

#include<stdio.h>
#include<stdlib.h>
int main(int argc, char const *argv[])
{
    printf("hello world\n");//\n不光是换行,还是刷新标准输出缓存区的条件(也就是把缓存区的内容打印到终端上)
    fflush(NULL);//强制刷新缓存区
    while(1);
    return 0;//程序正常退出也可以刷新缓存区
}

(3).不缓存:标准错误 strerr

练习: 计算标准输出缓存区大小 KB 方法一:循环遍历打印 方法二:使用标准输出stdout中的_io_buf_end-_io_buf_base

4.函数接口

4.1打开文件

   #include <stdio.h>
   FILE *fopen(const char *path, const char *mode);
   参数:path:打开文件
             mode:打开方式
             r:只读,流被定位到文件开头
             r+:可读可写,流被定位到文件开头
             w:只写,文件不存在创建,文件存在清空,流被定位到文件开头
             w+:可读可写,文件不存在创建,文件存在清空,流被定位到文件开头
             a:追加,文件不存在创建,存在追加,流被定位到文件末尾
             a+:可读可写,文件不存在创建,存在追加,开始进行读时从头读,进行写时流被定位到文件末尾,注:当a+的方式打开文件时,写只能在末尾进行追加,定位操作是无法改变写的位置,但是可以改变读的位置.
            返回值:成功:文件流
                           失败:NULL,并且设置errno(错误码)

#include<stdio.h>
int main(int argc, char const *argv[])
{
    FILE*fp;
    fp=fopen("test.txt","r");
    if(NULL==fp)
    {
        perror("fopen err");
        return -1;
    }
    printf("fopen success\n");
    return 0;
}
补充:

         perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出, 后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。 在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你设置的一些信息和现在的errno所对应的错误一起输出。

4.2关闭文件

#include <stdio.h>
int fclose(FILE* stream);
功能:关闭文件
参数:stream:文件流

4.3读写操作

4.3.1 fgetc()fputc()

fgetc

 #include <stdio.h>
int fgetc(FILE *stream);
功能:从文件中读一个字符
参数:stream:文件流
返回值:成功:读到字符
       失败或读到文件末尾:EOF(-1)

fputc

功能:向文件中写入一个字符, 成功写入后文件指针会自动向后移动一个字节位置。
参数:c:要写的字符
   	  stream:文件流
返回值:成功:写的字符的ASCII
       失败:EOF(-1)

针对文件读写

针对终端读写

4.3.2 feof,ferror
int feof(FILE * stream);
功能:判断文件有没有到结尾,也就是当前所在位置后面还有没有字符。
返回:如果到达文件末尾,返回非零值。如果后面还有字符则返回0。

ferror

练习:用代码实现cat的功能

int main(int argc, char const *argv[])
{
    if (argc != 2)
    {
        printf("err: %s <filename>\n", argv[0]); // 提示一下正确的格式: ./a.out <filename>
        return -1;
    }
    // 1.打开文件
    FILE *fp = fopen(argv[1], "r");
    if (NULL == fp)
    {
        perror("fopen err");
        return -1;
    }
    int ch;
    //打印文件中内容
    while ((ch = fgetc(fp)) != EOF)
        printf("%c", ch);
    fclose(fp);
    return 0;
}
4.3.3 fgets,fputs

针对终端

fgets
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
功能:从文件中读取一串字符
参数:s:存放读取的字符串的首地址
     size:读取的大小
     stream:文件流
返回值:成功:读取的字符串的首地址
       失败或读到文件末尾:NULL
特性:1.一次调用最多读取一行数据
     2.实际读到个数为size-1个,末尾自动添加\0
fputs
#include <stdio.h>
int  fputs(const char *s,  FILE *stream);
功能:向文件中写字符串
参数:s:要写的内容
    stream:文件流
返回值:成功:非负整数
       失败:EOF
#include<stdio.h>
int main(int argc, char const *argv[])
{
    char buf[32]="";
    fgets(buf,32,stdin);//将终端输入的字符存入buf,包括回车和\n,例如hello\n\0
    printf("buf:%s\n",buf);
    fgets(buf,32,stdin);//再将终端输入的字符存入buf,比如说输入66,就会将buf的前四个字符覆盖,此时buf为66\n\0o\n\0
    printf("buf:%s\n",buf);
    fputs("hello",stdout);//将hello输出到终端上
    printf("\n");
    fputs(buf,stdout);//将buf中的内容输出到终端上
    return 0;
}

针对文件

练习:用函数实现wc -l的功能(计算文件行数)

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    if (argc != 2)
    {
        printf("err: %s <filename>\n", argv[0]);
        return -1;
    }
    FILE *fp = fopen("test.txt", "r+");
    if (NULL == fp)
    {
        perror("fopen err");
        return -1;
    }
    char buf[32] = "";
    int len = 0;
    while (fgets(buf, 32, fp)!=NULL)//当fgets遍历到尾时返回NULL
    {
        if (buf[strlen(buf) - 1] == '\n')//当数组中最后一个数等于\n时行数+1
            len++;
    }
    printf("wc-l=%d\n", len);
    fclose(fp);
    return 0;
}
4.3.4二进制读写文件
可以读写任意类型的数据,以二进制的方式进行读写

fread

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件流读取多个元素
参数:	ptr :用来存放读取元素 (可以用来读取任意类型的数据)
        size :元素大小  sizeof(数据类型)
		nmemb :读取对象的个数
		stream :要读取的文件
返回值:成功:读取对象的个数
        读到文件尾或失败:0

fwrite

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:将二进制数据写入文件
参数: ptr :是一个指针,保存要输出数据的空间的地址。
       size :要写入的字节数 sizeof(数据类型)
       nmemb : 要进行写入元素的个数
       strem: 目标文件流指针
返回值:成功:写的元素个数
        失败 :-1
#include <stdio.h>
int main(int argc, char const *argv[])
{
    FILE *fp;
    int arr[3] = {1, 2, 3};
    int data[3] = {};

    fp = fopen(argv[1], "r+");
    if (fp == NULL)
    {
        perror("fopen err");
        return -1;
    }
    fwrite(arr, sizeof(int), 3, fp);//将arr数组中的三个元素转换为二进制,存放到文件流中
    //将位置指针定位到文件开头,不然上一步是写操作所以接着读的话会从末尾开始读从而什么都读不到
    rewind(fp); //定位到文件开头
    int i =fread(data, 4, 4, fp);//将文件流中的二进制数转换为要存放的数据类型存储到data中
    printf("%d\n",i);//虽然设置的读出个数为4,但是因为只有3个数,所以正确读出的个数为3
    printf("%d %d %d\n", arr[0], arr[1], arr[2]);
    printf("%d %d %d\n", data[0], data[1], data[2]);
    return 0;
}

4.4 文件定位操作

wind
#include <stdio.h>
void rewind(FILE *stream);
功能:将文件位置指针定位到起始位置
fseek
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
功能:文件的定位操作
参数:stream:文件流
     offset:偏移量:正数表示向后文件尾部偏移,负数表示向文件开头偏移
     whence:相对位置:
           SEEK_SET:相对于文件开头
           SEEK_CUR:相对于文件当前位置
           SEEK_END:相对于文件末尾
返回值:成功:0
        失败:-1

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp;
    fp = fopen(argv[1], "r+");
    if (fp == NULL)
    {
        perror("fopen err");
        return -1;
    }
    fseek(fp,5,SEEK_SET);//向后移动五个单位到6
    char a=fgetc(fp);
    printf("%c\n",a);
    rewind(fp);//让光标回到头
    char b=fgetc(fp);
    printf("%c\n",b);
    return 0;
}
ftell
#include <stdio.h>
long ftell(FILE *stream);
功能:获取位置指针当前的文件位置
参数:要检测的文件流
返回值:成功:当前的文件位置,出错:-1
#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp;
    fp = fopen(argv[1], "r+");
    if (fp == NULL)
    {
        perror("fopen err");
        return -1;
    }
    //计算文件字符个数
    fseek(fp,0,SEEK_END);//让光标移动到尾
    int len=ftell(fp);//让len记录广表达当前位置
    printf("%d\n",len);
    return 0;
}
补充:

1.rewind(fp)和fseek(fp, 0, SEEK_SET)等价
2.可以通过此函数计算文件中字符个数
3.当打开文件的方式为a或a+时,fseek不起作用

4.5 重定向打开文件

freopen

#include <stdio.h>
FILE * freopen(const char *pathname,  const char *mode,  FILE* fp)
功能:将指定的文件流重定向到打开的文件中
参数:path:文件路径
      mode:打开文件的方式(同fopen)
      fp:文件流指针
返回值:成功:返回文件流指针
        失败:NULL

​​​​​​​

标签:fp,文件,FILE,int,----,io,进程,include,buf
From: https://blog.csdn.net/qq_64136247/article/details/141452096

相关文章

  • OpenCV入门指南:开启计算机视觉之旅
    在计算机视觉领域,OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库,它提供了丰富的图像处理与视觉识别功能,广泛应用于学术研究与工业界。一、OpenCV安装在开始之前,你需要安装OpenCV库。这里以Python环境为例进行说明:使用pip安装:打开你的......
  • 学习笔记---并查集
    并查集并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。(1)朴素并查集:intp[N];//存储每个点的祖宗节点//返回x的祖宗节点intfind(in......
  • SEVERITY
    SEVERITY属性允许您更改分配给单个设计规则的严重性运行报告DRC时,在Vivado设计套件中检查(DRC)。了解更多信息关于运行DRC,请参阅《VivadoDesignSuite用户指南:系统级设计》中的此链接条目(UG895)[参考15]。您可以设置内置和自定义DRC的严重性。关于写作的信息自定义设计规则......
  • vivado SLEW
    SLEW为配置了I/O标准的输出缓冲区指定了输出缓冲区转换速率支持可编程输出转换速率。架构支持所有架构。适用对象•端口(get_Ports)°连接输出或双向端口•单元(get_cell)°输出缓冲器(所有OBUF变体)价值观•慢速(默认)•中等:适用于UltraScale体系结构,仅适用于高性能(HP)I/O。......
  • JS函数和闭包函数详解
    JS函数和闭包函数引言简要介绍主题在前端开发中,JavaScript函数是不可或缺的一部分。函数是JavaScript中的基本构建块,用于封装代码以实现模块化和可重用性。闭包函数则是JavaScript中的高级概念,它允许函数访问其词法作用域中的变量,即使在函数执行完毕之后。本文将详细介......
  • Python Lambda 表达式详解
    PythonLambda表达式详解1.引言在Python中,lambda表达式是一种创建小型匿名函数的方法。这种函数不需要使用def关键字来定义,通常用于编写简短的函数或作为其他函数的参数。lambda函数可以接受任意数量的参数,但只能有一个表达式,该表达式的结果就是函数的返回值。2.Lambd......
  • vue3 语法糖<script setup>
    在Vue3中,<scriptsetup>是一种新的语法糖,它极大地简化了组件的编写方式。<scriptsetup>是在单文件组件(SFC)中使用组合式API的编译时语法糖。当同时使用SFC与组合式API时该语法是默认推荐。基本概念简洁的语法:<scriptsetup>允许在<script>标签中直接使用组......
  • 【手机版+电脑版】最新版植物大战僵尸杂交版V2.3.7(文章末尾有下载链接)
    【手机版+电脑版】最新版植物大战僵尸杂交版V2.3.7(文章末尾有下载链接)前言本最新安装下载保姆级:支持苹果,安卓☆电脑☆电视,游戏分辨率扩充,UI界面翻新,卡槽数量提升至16个,修复大量BUG嘎嘎好玩话不多说直接下载链接下载链接⬇️⬇️注意:防止链接失效,建议先保存到自己网盘纯电......
  • SPFA算法
    1.spfa求最短路给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。数据保证不存在负权回路。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表......
  • 手机游玩植物大战僵尸杂交版V2.3.7最新版教程(文章末尾免费直接下载链接)
    手机游玩植物大战僵尸杂交版V2.3.7最新版教程【V2.3.7全面升级】植物大战僵尸杂交版:跨平台终极安装指南-苹果、安卓、电脑、电视兼容,界面革新,16卡槽扩展,高分辨率支持,BUG修复,畅享游戏乐趣前言《植物大战僵尸杂交版2.3.7》游戏本次作为一次紧急修复更新的版本,作者潜艇伟......