从零开始学习嵌入式复习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输入
还可以利用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);
}