从零开始学习嵌入式复习C_文件IO的操作 | 青训营笔记

107 阅读4分钟

从零开始学习嵌入式复习C_文件IO的操作

引言

又是学习C的一天,讲到新的区域,文件IO,对于文件IO的操作其实也并不是很陌生,open/close/write等,但是在实际应用中,又发现有很多细节的操作还没了解到位,所以这次一定要给他整明白!

文件IO

针对文件的操作

我们项目最终的代码被运行在Linux OS之下,因此在Linux OS中,所有的普通文件或者设备都被视为文件来处理,Linux下一切皆文件。

使用同一套接口即函数可以实现对于各种文件的统一操作,就不需要区分普通文件和设备文件各自该怎么操作。

使用同一个函数即可实现对其两者的操作。

文件操作流程

所有的文件操作都是以下流程构成:

(1)打开文件:open

头文件:
#include <sys/stat.h>
#include <fcntl.h>
函数原型:
「1」
int open(const char *pathname, int flags);

功能:打开文件

参数:

参数1:所需打开的文件路径(字符串) ​ 参数2:打开文件的方式: ​ 主标志:只读(O_RDONLY),只写(O_WRONLY),可读可写(O_RDWR) ​ 副标志:O_EXCL(创建的新文件已存在就报错),O_TRUNC(清空)O_CREAT(创建文件)

返回值:

文件打开成功会返回一个非负的文件描述符 ​ 失败返回-1

「2」
int open(const char *pathname, int flags,mode_t mode);

功能:打开文件

参数:

参数1:所需打开的文件路径(字符串) ​ 参数2:打开文件的方式: ​ 主标志:只读(O_RDONLY),只写(O_WRONLY),可读可写(O_RDWR) ​ 副标志:O_EXCL(创建的新文件已存在就报错),O_TRUNC(清空),O_CREAT(创建文件) ​ 参数3:文件的权限 ​ 0666:代表文件权限:用户,用户组,其他用户三者都是可写不可执行

总结:

open函数2个参数适合以只读方式打开文件

open函数3个参数适合以只写方式打开同时文件不存在时需要创建文件时,就会产生第三个参数

(2)操作文件:read/write

「1」read 函数:
头文件:
#include <unistd.h>
函数原型:
ssize_t read(int fd, void *buf, size_t count);

功能:实现读取文件内容

参数:

参数1:打开文件成功之后的返回值 ​ 参数2:读取数据之后存储空间的首地址 ​ 参数3:最多可以读取的字节数(空间的大小)

返回值:读取的数据的个数

「2」write函数:
头文件:
#include <unistd.h>
函数原型:
ssize_t write(int fd, void *buf, size_t count);

功能:实现写入内容到文件中

参数:

参数1:打开文件成功之后的返回值 ​ 参数2:所需写入内容存储空间的首地址 ​ 参数3:写入的字节数(指定多少就写入多少)

返回值:写入的数据的个数

(3)关闭文件:close

头文件:
#include <unistd.h>
函数原型:
int close(int fd);
参数:

文件描述符

(4)lseek输入

blog.csdn.net/andrewgithu…

还可以利用lseek,来指定输入字符位置

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

有SEEK_SET、SEEK_CUR、SEEK_END:

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);

练习题:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main(int argc, const char *argv[])
{
  //1.以只写方式打开一个不存在的文件
  int ret;
  if((ret = open("./test.c", O_WRONLY | O_CREAT | O_TRUNC, 0666))<0){  //名字为test.c
    perror("open_write_error");//打印错误
    return -1;
  };
  printf("open_write success!\n");
  
  //2.写文件
  //定义存储即将写入文件中的内容所在空间
  char Buf[100] = {0} //先定义为100
  //输入
  printf("请输入需要写入的内容:\n");
  fgets(Buf,sizeof(Buf),stdin); //尽量不用gets,stdin是键盘输入。fgets会读取换行符,字符数+1
  //scanf("%s",Buf);  //scanf不会读取换行符
  //
  int wr_count = 0;
  if(wr_count = write(fw, buf, strlen(Buf)) < 0){
    perror("write error");
    close(fw);
    return -1;
  }else if(0 == wr_count){
    printf("未写入任何数据!\n");
    close(fw);
    return -1;
  }else{
    printf("写入%d个字符到文件中!\n",wr_count);
  }
  
  close(fw);
}