基础c库文件IO/系统操作接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HL_HLHL/article/details/82563980

c库的文件IO操作接口

fopen

1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针。

2.函数原型:

FILE * fopen(const char * path,const char * mode);  
    -- path: 文件路径,如:"D:\phth\test.c"  
    -- mode: 文件打开方式,例如:  
             "r" 以只读方式打开文件,该文件必须存在。否则打开失败。  
             "w" 打开只写文件,若文件存在则文件长度清为0,即该文件内容被销毁。若文件不存在则建立该文件。  
             "a" 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。写入文件前删除EOF标记,在写入后恢复EOF标记。  
            "r+" 以读写的方式打开一个文件。该文件必须存在。
            "w+" 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。  

             "a+" 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)  
            "wb" 只写打开或新建一个二进制文件,只允许写数据。  
            "wb+" 读写打开或建立一个二进制文件,允许读和写。  
             "ab" 追加打开一个二进制文件,并在文件末尾写数据。  
             "ab+"读写打开一个二进制文件,允许读,或在文件末追加数据。     

4.返回值: 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

fclose

1.头文件:staio.h
2.函数功能:关闭一个流。
23.函数原型:

int fclose( FILE *fp );

fseek

1.头文件:stdio.h
2.函数功能:重定位流(数据流/文件)上的文件内部位置指针

注意:文件指针指向文件/流。位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变或指向别的文件。
3.函数原型:

int fseek( FILE *stream, long offset, int origin );

stream:为文件指针

offset:为偏移量,正数表示正向偏移,负数表示负向偏移

origin:设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

SEEK_SET: 文件开头

SEEK_CUR: 当前位置

SEEK_END: 文件结尾

其中SEEK_SET,SEEK_CUR和SEEK_END依次为012.

简言之:

fseek(fp,100L,0);把stream指针移动到离文件开头100字节处;

fseek(fp,100L,1);把stream指针移动到离文件当前位置100字节处;

fseek(fp,-100L,2);把stream指针退回到离文件结尾100字节处。

注意事项:fseek函数的文件指针,应该为已经打开的文件。如果没有打开的文件,那么将会出现错误。
4.返回值:成功,返回0,失败返回-1

fread

1.头文件:stdio.h
2.函数功能:它从文件流中读数据,最多读取count个项,每个项size个字节
3.函数原型:

size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
buffer:用于接收数据的内存地址

size:要读的每个数据项的字节数,单位是字节

count:要读count个数据项,每个数据项size个字节.

stream:输入流

4.返回值:如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回 0。

扫描二维码关注公众号,回复: 4065970 查看本文章

fwrite

1.头文件:stdio.h
2.函数功能:向指定的文件中写入若干数据块
3.函数原型:


size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;

(2)size:要写入内容的单字节数;

(3)count:要进行写入size字节的数据项的个数;

(4)stream:目标文件指针;

4.返回值:返回实际写入的数据项个数count

代码演示


   #include<stdio.h>
   #include<string.h>
   #include<errno.h>

   int main()
   {
       FILE* fp=NULL;//定义一个文件指针

       //打开文件以追加的方式可以读写tmp.txt文件
       fp=fopen("./tmp.txt","a+");
      if(fp==NULL){
          perror("fopen error");
          return -1;
      }

       //在文件中写入数据
      int ret= fwrite("hello HL\n",1,11,fp);
      if(ret==0){
       perror("fwrite error");
      }

     //因为fwrite函数在文件中写完数据后,文件指针指向文件的末尾位置,所以要设置文件指针的位置,设置在文件开始的地方
     fseek(fp,0,SEEK_SET);
     //读取数据
      char buff[1024]={0};
     int  ret =fread(buff,1024,1,fp);
      if(ret==0){
          perror("fread error");
      }
         printf("buff:[%s]\n",buff);
  //打开一个文件就必须关闭一个文件
     fclose(fp);
      return 0;
  }

printf

1.头文件:stdio.h
2.函数功能:格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。

printf()函数的调用格式为: printf(“<格式化字符串>”, <参量表>)。

格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明组成。要输出的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
3.函数原型:extern void printf(const char *format,…);

sprintf

1.头文件:stdio.h

2.功能:格式化字符串,将格式化的数据写入字符串(或者数组)中。

3.函数原型:

int sprintf(char *buffer, const char *format, [argument]...)
(1)buffer:是char类型的指针,指向写入的字符串指针;

(2)format:格式化字符串,即在程序中想要的格式;

(3)argument:可选参数,可以为任意类型的数据;

4.函数返回值:buffer指向的字符串的长度;

fprintf

1.头文件:stdio.h
2.功 能: 传送格式化输出到一个文件中
3函数原型:

int fprintf( FILE *stream, const char *format, ... );  

4.返回值
  成功时返回转换的字节数,失败时返回一个负数.
  在LINUX/UNIX操系统中成功返回0,失败返回-1。并置errno值.

代码演示

#include<stdio.h>
int main()
{
   char buff[1024]={0};

   //直接输出
   printf("printf>%s-%s-%s\n","HL","good","666");
   //将格式化的数据写入字符串(或者数组)中
   sprintf(buff,"sprintf>%s-%s-%s\n","HL","good","666");
   printf("%s",buff);
   //stdout标准输出----显示器----linux下一切皆文件
   fprintf(stdout,"fprintf>%s-%s-%s\n","HL","good","666");
return 0;
}

这里写图片描述

fgets

1.头文件:stdio.h
2.函数功能:从文件流中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋’\0’),如果文件中的该行,不足bufsize-1个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行。
3.函数原型:


char *fgets(char *buf, int n, FILE *fp)
*buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明存储数据的大小。

*stream: 文件结构体指针,将要读取的文件流。

4.返回值:
1)成功,则返回第一个参数buf;
2)在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;
3)如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。

使用时注意以下几点:

1.当遇到换行符或者缓冲区已满,fgets就会停止,返回读到的数据,值得注意的是不能用fgets读二进制文件,因为fgets会把二进制文件当成文本文件来处理,这势必会产生乱码。

2.每次调用,fgets都会把缓冲区的最后一个字符设为null,这意味着最后一个字符不能用来存放需要的数据,所以如果有一行,含有LINE_SIZE个字符(包括换行符),要想把这行读入缓冲区,请把参数n设为LINE_SIZE+1

  1. 由结论1可推出:给定参数n,fgets只能读取n-1个字符(包括换行符),如果有一行超过n-1个字符,那么fgets返回一个不完整的行,也就是说,只读取该行的前n-1个字符,但是,缓冲区总是以null字符结尾,对fgets的下一次调用会继续读该行。

fputs

1.头文件:stdio.h
2.函数功能:向指定的文件写入一个字符串(不自动写入字符串结束标记符’\0’)
3.函数原型:

int fputs(const char *str, FILE *stream);
str:这是一个数组,包含了要写入的以空字符终止的字符序列。

stream:指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流

4.返回值:成功返回一个非负值,如果发生错误则返回 EOF(-1)

代码演示

   #include<stdio.h>
   #include<string.h>
   #include<errno.h>
   int main()
   {
       FILE* fp;
       fp=fopen("tmp.txt","w+");
       if(fp==NULL){
          perror("fopen error");
      }

      int ret=fputs("hellow HL\nnihao\n",fp);
      if(ret<0){
          perror("fputs error");
      }


     fseek(fp,0,0);
      char buf[1024]={0};
      char* r=fgets(buf,100,fp);
      if(r==NULL){
          perror("fgets error");
     }
      printf("buf[%s]\n",buf);
      fclose(fp);
      return 0;
  }

fgetc

1.头文件:stdio.h
2.函数功能:从流中读取字符
3.函数原型:

int fgetc(FILE * stream);

4.返回值
fgetc()会返回读取到的字符,若返回EOF则表示到了文件尾,或出现了错误。(虽然返回一个字节,但返回值不为unsigned char的原因为,返回值要能表示-1(即为EOF)。)

fputc

1.头文件:stdio.h
2.函数功能:将字符ch写到文件指针fp所指向的文件的当前写指针的位置
3.函数原型:

int fputc (int c, File *fp)
fp:文件指针

ch:输出的字符量。

虽然函数被定义为整形数,但仅用其低八位。

4.返回值:在正常调用情况下,函数返回写入文件的字符的ASCII码值,出错时,返回EOF(-1)。当正确写入一个字符或一个字节的数据后,文件内部写指针会自动后移一个字节的位置

系统文件IO操作接口

open

1.头文件:sys/types.h
sys/stat.h
fcntl.h
2.函数功能:open是多种语言、环境的一种函数,LINUX中open函数作用:打开和创建文件。PB程序语言中open功能:打开窗口。
3.函数原型:

int open(const char * pathname, int flags);
    int open(const char * pathname, int flags, mode_t mode);
    pathname: 指向欲打开的文件路径字符串 flags:
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件. 
********上述三种旗标是互斥的, 也就是不可同时使用, 但可与下列的旗标利用OR(|)运算符组合.******
O_CREAT 如果文件存在则打开,不存在则创建
O_EXCL 如果O_CREAT 也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.
O_TRUNC 若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失.
O_APPEND 当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
O_NOCTTY 如果欲打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机.
O_NONBLOCK 以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
O_NDELAY 同O_NONBLOCK.
O_SYNC 以同步的方式打开文件.
O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接, 则会令打开文件失败.
O_DIRECTORY 如果参数pathname 所指的文件并非为一目录, 则会令打开文件失败。注:此为Linux2. 2 以后特有的旗标, 以避免一些系统安全问题. 

mode:
 如果文件不存在需要创建的时候,用于指定创建的文件权限
S_IRWXU00700 权限, 代表该文件所有者具有可读、可写及可执行的权限.
S_IRUSR 或S_IREAD, 00400 权限, 代表该文件所有者具有可读取的权限.
S_IWUSR 或S_IWRITE, 00200 权限, 代表该文件所有者具有可写入的权限.
S_IXUSR 或S_IEXEC, 00100 权限, 代表该文件所有者具有可执行的权限.
S_IRWXG 00070 权限, 代表该文件用户组具有可读、可写及可执行的权限.
S_IRGRP 00040 权限, 代表该文件用户组具有可读的权限.
S_IWGRP 00020 权限, 代表该文件用户组具有可写入的权限.
S_IXGRP 00010 权限, 代表该文件用户组具有可执行的权限.
S_IRWXO 00007 权限, 代表其他用户具有可读、可写及可执行的权限.
S_IROTH 00004 权限, 代表其他用户具有可读的权限
S_IWOTH 00002 权限, 代表其他用户具有可写入的权限.
S_IXOTH 00001 权限, 代表其他用户具有可执行的权限.

4.返回值:
若所有欲核查的权限都通过了检查则返回0 值, 表示成功,
只要有一个权限被禁止则返回-1.

close

1.头文件:unistd.h
2.函数功能:关闭一个已经打开的文件
3.函数原型:

int close(int fd)
fd:文件描述符

4.返回值:
成功:返回0;
失败:返回-1,并设置errno

read

1.头文件:unistd.h
2.函数功能:将一个文件的数据读取到一个数组中
函数说明:read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。
3.函数原型:

ssize_t read(int fd,void * buf ,size_t count);

如果顺利read()会返回实际读到的字节数,最好能将返回值与参数count 作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作
4.返回值:
成功:非负数(返回读取到的字节数)
失败:-1,错误代码存入errno中,而文件读写位置则无法预期。

write

1.头文件:unistd.h
write有两种用法。
一种是:ssize_t write(int fd, const void *buf, size_t nbyte);

fd:文件描述符;

buf:指定的缓冲区,即指针,指向一段内存单元;

nbyte:要写入文件指定的字节数;

返回值:写入文档的字节数(成功)
-1(出错)

write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.

另一种是: write(const char* str,int n)

str:字符指针或字符数组,用来存放一个字符串。
n:用来表示输出显示字符串中字符的个数。

write(“string”,strlen(“string”);表示输出字符串常量

lseek

1.头文件
sys/types.h
unistd.h
2.函数功能:将一个文件的数据读取到一个数组中
函数说明:每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。当read()或write()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置。
3.函数原型

off_t lseek(int filde,off_t offset ,int whence);
fildes: 为已打开的文件描述词
offset:根据参数whence来移动读写位置的位移数。
**Offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。**

参数
whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为012).

SEEK_SET 将读写位置指向文件头后再增加offset个位移量。

SEEK_CUR 以目前的读写位置往后增加offset个位移量。

SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

1) 欲将读写位置移到文件开头时:lseek(int fildes,0,SEEK_SET);

2) 欲将读写位置移到文件尾时:lseek(int fildes,0,SEEK_END);

3) 想要取得目前文件位置时:lseek(int fildes,0,SEEK_CUR);

4.返回值
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。
若有错误则返回-1,errno 会存放错误代码。

代码演示


  #include<stdio.h>
  #include<string.h>
  #include<errno.h>
  #include<sys/types.h>
  #include<sys/stat.h>
  #include<fcntl.h>

  int main()
   {
      int fd=0;

      umask(0);//将文件创建权限掩码设置为0
     fd=open("tmp.txt",O_RDWR|O_CREAT|O_APPEND,0777);
     if(fd<0){
         perror("open error");
         return -1;
     }

     char buff[1024]="hello world\n";
      size_t w_len=write(fd,buff,strlen(buff));
      if(w_len<0){
          perror("write error");
          return -1;
      }
      printf("real write len:%ld\n",w_len);

       //跳转fd所代表的文件读写位置至起始位置的0偏移量处
     lseek(fd,0,SEEK_SET);

     char tmp[1024]={0};
     size_t r_len=read(fd,tmp,1024-1);
      if(r_len<0){
          perror("read error");
      }
      printf("r_len->%d->%s\n",r_len,tmp);

      close(fd);
     return 0;

 }

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/82563980