1,文件IO

1)open——打开或创建一个文件

    open(char *,flag,mode)在fcntl.h文件中声明。

参数:

    char *  包含有文件名和路径

    flag   打开文件方式

    mode  创建文件的权限

    

    flag 内容

flag 功能
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
   
O_CREAT 创建一个文件
O_EXCL 如果使用O_CREAT是文件存在,则可返回错误消息。这一参数可测试文件是否存在
O_TRUNC 打开文件(会删除已存在的内容)
O_APPEND 追加方式打开文件(不会删除已存在的内容)

    权限:文件权限 == mode&(~umask)

 返回值:

    成功:文件描述符(在一个进程中,为了区别每个文件),非负正整数,即文件的ID号;

    出错:-1;  

2)write————写

  write (int fd,void *buf,size t count);

  参数:

    fd  向哪个文件去写

    *buf 写什么内容

    t   写多少个

  返回值:

    实际写的字节数

 

3)read————读  

  read (int fd,void *buf, size t count)

  参数:

    fd  从哪个文件去读

    *buf 读什么内容

    t   读多少个

  

  返回值:

    实际读的字节数

4)close————关闭文件

close(fd);

——————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————

5)  lseek ————调整读写位置指针

  lseek(int fd,off_t offset,int whence);

  头文件:sys/types.h    unist.h;

  参数:

    fd : 要调整的文件的文件描述符

    offset : 偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负;

    whence :  当前位置的基点,有三个标志:

        SEEK_SET    :  当前位置为文件的开头,新位置为偏移量的大小(后移为正,前移为负)

        SEEK_CUR   :     当前位置为文件指针的位置,新位置为当前位置加偏移量

        SEEK_END   :   当前位置为文件的结尾,新位置为文件大小加偏移量的大小

  返回值:

      成功:文件当前的位置

      出错:-1

******************************************************************************************************************************************************************************

文件IO:是直接调用内核提供的系统调用函数,头文件:unistd.h

标准IO:是间接点用系统调用函数,头文件: stdio.h

三个缓存:

1,程序中的缓存,就是你想从内核读写的缓存(数组)——用户空间的缓存

2,每打开一个文件,内核在内核空间中也会开辟一块缓存,——内核空间缓存

    文件IO的 写  ——> 将用户空间的缓存写到内核空间的缓存中

    文件IO的 读  ——>将内核空间的缓存读到用户空间的缓存

3,标准IO的库函数中也有一个缓存 ——  库缓存

2,标准IO

  printf满足一定条件才能将库缓存的内容写到内核:遇到\n;库缓存写满时,会调用系统调用函数。(库缓存为1024字节)

1)fopen    打开

2)  fclose    关闭  ,在关闭之前刷新缓存区,强制写入内核

3)  fseek,rewind   位置指针 

4)   读写函数较多(分三类:全缓存,行缓存,无缓存)

1) FILE *fopen (const char *path , const char *mode);                创建一个文件设置的权限为666,生成文件的权限为 666&(~umask)

  返回值:FILE *    文件流指针        类似于文件IO中的文件描述符

    FILE  定义 : struct_IO_FILE       在/usr/include/libio.h

            包含读写缓存的首地址、大小、位置指针等

  标准的输入流:stdin    0

  标准的输出流:stdout  1

  标准的出错流: stderr  2

  

  参数:path  文件的位置

     mode     相当于文件IO的flag      (char *    字符串)

        b :  二进制文件

        r :  只读方式打开文件,文件必须存在

        w/a :   只写方式打开文件,文件不存在则创建;

                区别: w ==  O_TRUNC  ;  a  ==  O_APPEND

        +  :    读写方式打开文件,文件必须存在;

2)fcloes

3)读写函数

  1, 行缓存    遇到新行符(\n) 或写满缓存时,即调用系统调用函数

          读: fgets,gets,printf,fprintf,sprintf

          写: fputs,puts,scanf

  2,    无缓存    只要用户调用这个函数,就会将其内容写到内核中

  3,全缓存    只有写满缓存再调用系统调用函数

          读 :fread

          写 :fwrite    

3.1    行缓存的读写函数fgets, fputs

      char *fgets (char *s,int size , FILE *stream);

      参数:

        s :      缓存,即读到哪里去

        size :     读多少字节

        stream  :  从什么地方读

      返回值:

        成功: s (缓存的地址)

        已处于文件尾端或出错: null

      

      int fputs (const char *s,FILE *stream);

      参数:

        s :      缓存。即写什么内容

        stream  :  写到哪里去

      返回值:

        成功:非负值

        出错:EOF   -1

3.2 fflush(FILE *fp)

    把库函数的缓存内容强制写入内核(在fclose 中包含)

3.3  无缓存: stderr

      stdout   行缓存

3.4 调整位置指针

      fseek()

      参数与lseek()一致,但返回值不同

      返回值:

          成功:0

          失败:-1

      rewind(FILE *fp) 用于设定流的文件位置指示为文件开始,该函数调用成功无返回值。

        rewind()  ==    (void) fseek(fp 0,SEEK_SET);

      

      ftell(FEIL *fp)

          用于取得当前的文件位置,调用成功则为当前文件位置指示,出错则为 -1L;

3.5  行缓存的读写函数 gets , puts

    char *gets (char *s);

    int puts (const char *s);

      

    gets 与  fgets 的区别:

       gets() 时不能指定缓存的长度,可能造成缓存越界,写到缓存之后的存储空间,产生不可预料的后果;

       gets()只能从标准输入中读;

       gets() 并不将新行符存入缓存,fgets()将新行符存入缓存;

    puts 与 fputs 的区别:

        puts()只能向标准输出中写;

        puts() 输出是会添加一个新行符,fputs() 不会添加;

3.6    fprintf, printf, sprintf             行缓存的函数

      int fprintf (FILE *stream,"字符串格式")

        fprintf  可以输出到文件中,也可以输出到显示器        eg: fprintf(fp,"hello linux");

        printf   只能输出到显示器

      int sprintf (str *,"字符串格式")

        输出内容到一个字符串中                   eg: char buf[128] = 0;   sprintf (buf,"hello linux");

3.7    一个字符的读写函数

      int fgetc(FILE *fp)        将文件中的内容一个字符的输出到显示器,到文件结尾时返回EOF

          功能: 从文件读取一个字符

          参数: 文件流

          返回值: 正确为读取到的字符;到文件结尾或出错时返回EOF

        

      int fputc(int c, FILE *fp)      输入一个字符到文件中,成功则返回输入的字符,出错则返回EOF

          功能:写一个特字符到文件中

          参数:第一个参数为要写的字符,第二个为文件流

          返回值: 正确为返回输入的字符,出错返回EOF

      fputs 有缓存,但不是行缓存

——————————————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————————————————

3.8   feof       判断受否已经到文件结尾

    int feof (FILE *stream);

    参数:文件流

    返回值:文件结束,返回非0;没有则返回0;

3.9    ferror    判断是否读写错误

    int derror (FILE *stream);

    参数:文件流

    返回值: 是读写错误,返回非0;不是则返回0;

3.10  clearerr   清除流错误

    void clearerr (FILE *stream);

    参数:文件流

————————————————————————————————————————————————————————————————————————————————

————————————————————————————————————————————————————————————————————————————————

全缓存

    fread 和 fwrite    全缓存的读写函数

  size_t fread (void *ptr ,size_t size,size_t nmemb,FILE *stream);

  size_t fwrite (const void *ptr,size_t size,xize_t nmemb,FILE *stream);

  参数:

      ptr:      写的内容

      size:      写的内容中,每一个单元所占的字节数

      nmemb:    写的内容中,有多少个单元

      stream:              写到哪里去

      总共所写的字节:size * nmemb

      返回值: 实际读写的单元数

linux下静态库和动态库的制作与使用

  • 静态库

      libxxx.a , 在编译时就将库编译进可执行程序中。

      优点:程序的运行环境中不需要外部的函数库

      缺点:可执行程序大

  • 动态库

      又称共享库,libxxx.so ,在运行时将库加载到可执行程序中。

      优点:可执行程序小

      缺点:程序的运行环境中必须提供相应的库。

  函数库目录:/lib           /usr/lib

  静态库的制作:

    1,生成目标文件:gcc  -c  file.c

    2,静态库创建命令  ar

        ar -cr  libfile.a  file.o

          -c  :  create

          -r  :replace ,表示当插入的模块 file.o 已经存在 libfile.a 中,则覆盖。反之 ar 显示一个错误消息

    1)由源文件生成目标文件  gcc -c -o sub.o sub.c

    2)把目标文件生成静态库  ar -cr -o libsub.a sub.o

    3)  gcc -o  a  main.c -L. -lsub      . 代表当前目录;-lcub 默认libxxx.o

  动态库制作:

    1,生成目标文件 :gcc  -c -o file.c

    2,gcc  -shared -fpic -o libfile.so file.o

          -fpic :   产生位置无关代码

          -shared: 生成共享库。

      用上述命令生成 libsub.so 动态函数库

      gcc -o out main.c -L. -lsub

      此时还不能直接 ./out  ,因为在动态函数库使用时,会查找/usr/lib   /lib  目录下的动态函数库,而此时生成的库还不在里边

      

      解决方法:

        1) 把  libsub.so  放到 /usr/lib   /lib 中去

        2)假设  libsub.so  在/home/linux/file 中        环境变量的方式

               export LD_LIBRARY_PATH = /home/linux/sddsub

               LD_LIBRARY_PATH

        3)  在 /etc/l.so.conf 文件中加入生成库的路径,然后 /sbin/ldconfig

             /etc/ld.so.conf 时非常重要的一个目录,里面存放的时链接器和加载器搜索共享库时要检查的目录,默认是从 /usr/lib   /lib  中读取,所以可以把库的目录假如这个文件并执行  /sbin/ldconfig

目录IO

      #include <sys/types.h>

      #inlcude <dirent.h>

目录IO 文件IO

opendir  只能打开目录

mkdir    创建目录

open
readdir   读目录 read

rewinddir      调整指针位置

telldir

seekdir

rewind

ftell

fseek

closedir        关闭目录

close

    1,opendir

      DIR *opendir (const char *pathname);

      参数:打开的目录及路径

      返回值: 成功返回目录流指针,出错返回NULL

      int  mkdir (const char * path ,mode_t mode )

        path:      为想创建的目录文件路径

        mode:    为该目录的访问权限

        返回值:若目录创建,则返回0;否则-1;

        生成的目录权限仍和umask有关

    2,readdir

      struct dirent *readdir (DIR *dr)

      参数:目录流指针

      返回值:成功 则为 struct  dirent  指针,瑞在目录尾或出错则返回NULL

      struct dirent 定义在头文件 dirent.h中

      此结构至少包括下列两个成员:

      struct dirent

        {

            ino_t d_ino ;  // inode 号  

            char d_name[NAME_MAX+1];    //文件名

        }

     3,rewinddir:     重置读取目录的位置为开头

       void rewinddir(DIR *dr);

       参数:目录流指针

        long telldir(DIR *dirp)    读取当前指针的位置

        参数:目录流指针

        返回值:目录流当前位置

        

        void seekdir(DIR *dirp,long loc);

        类似于文件定位函数fseek(), 在目录流上设置下一个 readdir() 操作的位置

        参数:目录流指针和偏移量

         

linux高级编程——IO的更多相关文章

  1. linux高级编程基础系列:线程间通信

    linux高级编程基础系列:线程间通信 转载:原文地址http://blog.163.com/jimking_2010/blog/static/1716015352013102510748824/ 线 ...

  2. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  3. 面向对象的高级编程&IO编程

    1.给类对象绑定的函数,只对这个对象生效, 而对类绑定的对象, 所有的对象都可以调用. 栗子: def set_score(self, score): self.score = score s.set ...

  4. Linux高级编程--05.文件读写

    缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...

  5. LINUX网络编程 IO 复用

    参考<linux高性能服务器编程> LINUX下处理多个连接时候,仅仅使用多线程和原始socket函数,效率十分低下 于是就出现了selelct poll  epoll等IO复用函数. 这 ...

  6. linux网络编程 IO多路复用 select epoll

    本文以我的小型聊天室为例,对于服务器端的代码,做了三次改进,我将分别介绍阻塞式IO,select,epoll . 一:阻塞式IO 对于聊天室这种程序,我们最容易想到的是在服务器端accept之后,然后 ...

  7. Linux高级编程--10.Socket编程

    Linux下的Socket编程大体上包括Tcp Socket.Udp Socket即Raw Socket这三种,其中TCP和UDP方式的Socket编程用于编写应用层的socket程序,是我们用得比较 ...

  8. linux网络编程IO模型

    同步与异步:         同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成.         异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要 ...

  9. Linux高级编程--02.gcc和动态库

    在Linux环境下,我们通常用gcc将C代码编译成可执行文件,如下就是一个简单的例子: 小实验:hello.c #include <stdlib.h> #include <stdio ...

随机推荐

  1. English Conversation – NUMBERS

    English Conversation – NUMBERS Share Tweet Share Tagged With: Numbers Study the pronunciation of num ...

  2. Haskell语言学习笔记(78)fix

    fix 函数 fix 是一个在 Data.Function 模块中定义的函数,它是对于递归的封装,可以用于定义不动点函数. fix :: (a -> a) -> a fix f = let ...

  3. Haskell语言学习笔记(76)Data.Tree

    Data.Tree data Tree a = Node { rootLabel :: a, subForest :: Forest a } deriving (Eq, Read, Show) typ ...

  4. jQuery+php实现二级联动

    public function liandong(){ $arr = Db::table("city")->where("pid=0")->sele ...

  5. sqlalchemy学习-- 重要参数

    Base = declarative_base 基类: 1.存储表 2.建立class-Table 的映射关系 engine = create_engine('mysql://root:root@lo ...

  6. js对象和jquery对象互相转换

    javascript对象转成jquery对象 jquery对象转成javascript对象

  7. 问题描述: fatal error: 'XCTest/XCTest.h' file not found

    #import 解决方法:在报错的Target中的Building settings中FRAMEWORK_SEARCH_PATHS添加$(PLATFORM_DIR)/Developer/Library ...

  8. js判断json对象中是否含有某个属性

    obj.hasOwnProperty("key"); 原地址:https://blog.csdn.net/feicongcong/article/details/53463872

  9. 吴裕雄 22-MySQL 事务

    MySQL 事务MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据 ...

  10. Java字节流Stream的使用,创建方法

    首先:FileOutputStream写入数据文件 学习父类的方法 使用子类的对象 步骤: 1:子类中的构造方法   作用  :绑定输出的目的地 FileOutputStream fos= new F ...