linux操作系统day1(io文件处理)

IO(文件)

文件操作:


文本文件,mp3,jpeg,png ,mp4,avi
 

文件:
    一组相关数据的有序集合
文件名:
    这组相关数据的一个名称

linux里面对文件的处理:

思想:
      一切皆文件 ,文件用来存储数据(数据、指令)

b c d - l p s 

b -- block      -- 块设备文件   --- 硬盘(存储设备) 
c -- character  -- 字符设备文件 --- 鼠标 
d -- directory  -- 目录文件     
- -- regular    -- 普通文件 
l -- link       -- 软连接文件   --- 类似windows的快捷方式  
p -- pipe       -- 管道文件     --- 实现操作系统中 进程间的一些 信息交换(通信)
s -- socket     -- 套接字文件   --- 网络的时候 (进程间的通信)

文件操作三步骤:

1.打开 
2.读写    
3.关闭 

Linux提供的两种文件操作方式:

文件编程:

1.标准IO --- 库函数  -------标准c库函数,
2.文件IO --- 系统调用-------Linux内核为用户提供的函数接口

系统调用:

Linux内核为用户提供的函数接口

库函数:

标准c库函数, 对Linux内核中系统调用的封装

标准IO库:

1.标准io的概念 

1975 Dennis Ritchie编写, IO库,
    从C语言的标准,ANSI c 
    IO  input  output
    I: 键盘是标准输入设备 ====》默认输入就是指键盘  /dev/input
    O: 显示器是标准输出设备 ==》默认输出就是指显示器

Linux操作系统当中IO都是对文件的操作
    C一部分,任何支持标准C的系统都可使用标准IO实现文件存储
    标准IO在UNIX上是对文件IO的封装

一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,
    加入缓冲区,可以有效减少系统调用的次数,节省系统IO调度资源

2.功能:

用来操作普通文件

 普通文件:

1.ASCII码文件(代码、文本文件)
2.二进制文件(音视频、图片)
        
        ASCII码文件是一种特殊的二进制文件
        
        2021
        '2' '0' 2' '1' 
        
        2021
        0000 0000 0000 0000 0000 0111 1110 0101

3.操作方法

    1.打开 -- fopen  //FILE open
    2.读写 --
              fgetc / fputc   读出、写入单个字符
              fgets / fputs   读出、写入一行字符
              fread / fwrite  读出、写入指定长度数据
    3.关闭 -- fclose          


    man手册
    标准man手册分为8个章节:
    man 1        用户命令
    man 2        系统调用
    man 3        c函数库调用
    man 4        设备文件和特殊文件
    man 5        配置文件和格式
    man 6        游戏相关
    man 7        杂项,总述
    man 8        管理类命令

4.API函数接口
1.fopen

#include <stdio.h>
    FILE* fopen(const char *path, const char *mode);
    功能:
         流打开函数 (打开文件,并关联到一个流)
    参数:
        @path --要打开的文件的文件名(字符串形式)
        @mode --打开文件的操作模式
            r ---打开文件做读操作
                 注意:
                 文件必须存在 
                 
            r+   打开文件做读写操作
                 注意:
                 文件必须存在
                 
            w    打开文件做写操作
                 注意:
                 如果文件已经存在,则会将文件清空为0
                 如果文件不存在,则会创建一个新文件。
                 
            w+  打开文件做读写操作
                 注意:
                 如果文件已经存在,则会将文件清空为0
                 如果文件不存在,则会创建一个新文件。

            a    打开文件做写操作
                 注意:
                 如果文件已经存在,则在文件末尾进行写入 
                 如果文件不存在,则会创建一个新文件。
                 
            a+   打开文件做读写操作
                 注意:
                 如果文件已经存在,则在文件末尾进行写入 
                 如果文件不存在,则会创建一个新文件。
    返回值:
       成功 FILE *  (文件流指针)
       失败 NULL 并且 设置 errno 表明错误原因 

     

流:


        数据从文件当中流入和流出所体现出来的字节流叫做流

        FILE 结构定义的对象(FILE * 指向的对象)称之为流对象,FILE *叫文件流指针。


        标准IO将对文件的操作转换成了对"流"的操作。
        所以,标准IO的文件相关的函数都是围绕着 FILE进行的。
         
          FILE * fp 
          FILE * fp;//流指针------关联一个文件   
          FILE * 实际上是指向了一块内存空间(缓存,fileno)
          
          
          FILE *fp <->【FILE结构体[缓存,fileno]】//堆区(malloc)

2.fclose

   int fclose(FILE *fp);
      功能:
        关闭文件流指针 
      参数:
        fp:文件流指针 
      返回值:
        成功返回0 
        失败返回EOF(-1)
        
      注意:fopen操作完毕后使用fclose关闭,否则会产生内存泄漏
           不要重复调用fclose 

3.fputc


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

操作系统在运行一个程序时,会默认打开三个流:
        stdin        FILE*        标准输入流   ---->键盘
        stdout         FILE*        标准输出流   ---->屏幕
        stderr         FILE*        标准出错流   ---->屏幕

    
    gets scanf getchar ->  stdin 
    puts printf putchar -> stdout 
    perror -> stderr 


4.fgetc()函数的结束判断。


1、EOF 宏来判断 ===》系统预制的文件结束标记
end of file  -1

c = fgetc(fp);
   if(EOF == c) ///file end;
   if(!feof(fp))
   
   while(1)
   {
        c=fgetc(fp);
        if(feof(fp))
           break;    
   }
2、feof() 函数判断到文件末尾  // ferror()
int feof(FILE *stream);
功能:
      判断当前参数stream的文件流指针是否到达文件结尾。
      如果到达文件结尾则返回真,否则返回假
      注意:
      该操作一定要在一次IO操作之后判断(在一次读写操作后判断)。
参数:
      stream 要判断结尾的文件流对象
返回值:成功到达结尾是 真
        否则 是假

文件的copy:使用fgetc和fputc进行普通文件之间的转换,以及./a.out的使用方式,可以通过ls _l的方式进行查看该文件的所占字节数,可以看到被拷贝文件的字节空间与复制文件的字节数相等。可以copyASCII形式和二进制形式文件,及(文本文件和照片文件);


5.ferror() 


      int ferror(FILE *stream);
   功能:
        判断当前参数stream的文件流指针是否出错。
    参数:
         stream 要判断的文件流对象指针
    返回值:出错 真
           否则 假 
 

6.fputs


    int fputs(const char *s, FILE *stream);
    功能:
           向流中写入一行字符串       
    参数: s 
               要写的信息,一般是固定的字符串或者有数据的数组。
           stream 
               要写入的目标文件流对象

    返回值:成功 nonnegative number on success
            失败 -1;
        
    注:
        不写入 '\0' 
    
    puts和fputs的区别:
        1.fputs不会自动增减\n
        2.puts 会多打印\n字符

    7.fgets


    //按行读写   按字符串读写 
    fgets  -- char ---> string 
    fputs  -- char ---> string

    char *fgets(char *s, int size, FILE *stream);
    功能:
          从stream流对象关联的文件中获取size大小字节的文本数据
      并存储到s对应的本地内存(栈区数组,堆区内存)
          
    参数: s    要存储数据的本地内存(栈,堆)
    
           size 要获取的数据长度,单位字节。
           stream 要获取的目标文件流对象,

            可以是stdin ,程序会阻塞等待
            如果是普通文件fp 则指向文件第一行数据
    返回值:成功 返回指向有效数据的首地址,一般等于s的地址
            失败 或者 文件末尾 NULL;

        注意:
        1.fgets能读取一行就读取一行
        2.fgets会读到n个数据,如果n个数据中存在\n字符则立即停止当
          前的读取操作,如果没有\n,则读取n-1个字符,最后一个存储\0    
        3.fgets每行读取的数据后面都有一个\n,在\n后面存放一个\0
                     12345
            buf[] = '1''2''3''4''5''\n''0'

        4.gets是危险的,因为没有规范读到数据的上限              
        5.gets会去掉从终端读入的\n字符 //也读走了\n 但是将 \n 去掉了 \n --> '\0'

文件的copy:使用fgets和fputs进行普通文件之间的转换,fgets与fgetc获取方式的不同为,fgets是读取一行字节空间(截图中p【48】即为本行内容所能读取的字节大小),fputs与fputc上同。以及./a.out的使用方式,可以通过ls _l的方式进行查看该文件的所占字节数,可以看到被拷贝文件的字节空间与复制文件的字节数相等。可以copyASCII形式形式文件,及(文本文件);不可以copy二进制形式文件,即(照片文件);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值