linux操作系统读写文件操作(c语言)

(一)open系统的调用

为了创建一个新的文件描述,需要使用系统调用open

#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int open(const char* path,int oflags);
int open(const char* path,int oflags,mode_t mode);//mode_t对文件的权限
  • 如果调用成功,则返回非负整数,否则返回-1
  • path:准备打开的文件设备名字
  • oflags:通过必需文件访问模式与可选模式相结合的方式来指定
    1.必需指定的访问模式之一:O_RDONLY(打开只读),O_WDONLY(只写),O_RDWR(读写)
    2.可选模式:O_APPEND(追加),O_TRUNC(若果文件存在,则删除,然后新建一个空的),O_CREAT(如果文件将会新建),O_EXCL

(二)close系统调用

#include<unistd.h>
int close(int fildes);
  1. 可以使用close系统调用终止文件描述符fildes
  2. 若调用成功,返回0,失败返回-1

例子

  #include <stdio.h>
   #include <fcntl.h>
   #include <sys/types.h>
   #include <sys/stat.h>
   #include <unistd.h>
   int main()
   {
           int fd;
           char *name="open.txt";
          if(fd=open(name,O_CREAT|O_RDONLY,0644)<0)
                          perror("open: ");
          else
          printf("Open file success\n");
          if(close(fd)<0)
          perror("close: ");
          else
          printf("Closed file success\n");
  }
 

Ubuntu系统操作步骤:

  1. vim open.c //创建文件
  2. 点击i,进入插入模式
  3. 输入代码
  4. 点击esc键,输入:,在输入wq
  5. gcc open.c//编译
  6. ./a.out//运行

(三)read系统调用

  • read系统调用:与文件描述符filds相关联的文件里读入nbytes个字节数据,并把它们放入buff中。他返回实际读入的字节数,若返回0,就表示未读入任何数据;返回-1,就表示发生错误
  • read系统调用的原型:
 #include<unistd.h>
 size_t read(int filds,void *buf,size_t nbytes);

(三)write系统调用

  • write系统调用:把缓冲区buf前的nbytes个字节写入与文件描述符filds关联的文件中。他返回实际写入的字节数。若返回0,就表示未写入任何数据;返回-1,表示发生了错误
  • 原型:
 #include<unistd.h>
 size_t write(int filds,const void *buf,size_t nbytes)

例子

#include <stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
int main()
{
 int fd,size;
 char s[]="hello",buffer[80]={0};
 fd=open("1.txt",O_WRONLY|O_CREAT,0644);
 write(fd,s,sizeof(s));
 close(fd);
 fd=open("1.txt",O_RDONLY);
 read(fd,buffer,sizeof(buffer));
 close(fd);
 printf("buffer = %s\n",buffer);
}

(四)文件读写位置控制

#include<unistd.h>
#include<sys/types.h>
off_t lseek(int fildes,off_t offset,int whence);

lseek系统调用对文件描述符filds的读写指针进行设置,可以用它设置文件下一个读写位置(可以跳跃读写)

  • offset指定位置,正数向后移,负数向前移
  • whence:
    • SEEK_SET:开始出
    • SEEK_CUR:当前位置
    • SEEK_END:末尾
  • 失败返回-1,成功返回从文件头到文件指针被设置处的字节偏移值

例子

#include <stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
int main()
{
int fd,size;
 char s[]="hello,word!",buffer[80]={0};
 fd=open("1.txt",O_RDWR|O_CREAT,0644);
 write(fd,s,sizeof(s));//写完指针到达文件末尾
 memset(buffer,0,sizeof(buffer));//清空buffer
 read(fd,buffer,sizeof(buffer));//read只能向后读,而此时指针在文件末尾,所以为空
 printf("1.buffer = %s\n",buffer);
 lseek(fd,-12,SEEK_CUR);//从当前位置向前跳跃12个位置(还有一个\0,所以11+1),到达文件头
 memset(buffer,0,sizeof(buffer));
 read(fd,buffer,sizeof(buffer));
 printf("2.buffer = %s\n",buffer);
lseek(fd,0,SEEK_SET);
 memset(buffer,0,sizeof(buffer));
 read(fd,buffer,3);//读3个hel,文件指针也在此处
 printf("3.buffer = %s\n",buffer);
memset(buffer,0,sizeof(buffer));
 read(fd,buffer,sizeof(buffer));//从4个开始
 printf("4.buffer = %s\n",buffer);
 lseek(fd,-7,SEEK_END);
 memset(buffer,0,sizeof(buffer));
 read(fd,buffer,sizeof(buffer));
 printf("5.buffer = %s\n",buffer);
 }
原创文章 18 获赞 5 访问量 945

猜你喜欢

转载自blog.csdn.net/qq_40666149/article/details/105700829