一、linux文件操作
1. 创建
int creat(const char* filename, mode_t mode)
- filename 表示要创建的文件名
- mode表示对该文件的读写权限
int umask(int newmask) 调用将 umask 设置为 newmask,然后返回旧的 umask,它只影响读、写和执行权限
- S_IRUSR 用户可以读
- S_IWUSR 用户可以写
- S_IXUSR 用户可以执行
- …等等
除了可以通过上述宏进行“或”逻辑产生标志以外,我们也可以自己用数字来表示,Linux用 5 个数字来表示文件的各种权限:第一位表示设置用户 ID;第二位表示设置组 ID;第三位表示用户自己的权限位;第四位表示组的权限;最后一位表示其他人的权限。每个数字可以取 1(执行权限)、2(写权限)、4(读权限)、0(无)或者是这些值的和。例如,要创建一个用户可读、可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户 ID 位。那么,我们应该使用的模式是 1(设置用户 ID)、0(不设置组 ID)、7(1+2+4,读、写、执行)、0(没有权限)、5(1+4,读、执行)即 10 705。
2. 打开
int open(const char* filename, int flags);
int open(const char* filename, int flags, mode_t mode);
open()函数有两个形式,其中 pathname 是我们要打开的文件名。
- O_RDONLY 以只读的方式打开文件
- O_WRONLY 以只写的方式打开文件
- O_RDWR 以读写的方式打开文件
- O_APPEND 以追加的方式打开文件
- O_CREAT 创建一个文件 //使用第二种形式
- O_EXEC 如果使用了 O_CREAT 而且文件已经存在,就会发生一个错误
- O_NOBLOCK 以非阻塞的方式打开一个文件
- O_TRUNC 如果文件已经存在,则删除文件的内容
open(“test”, O_CREAT, 10 705) 创建一个text文件并且打开它,对它的权限用户ID读写,组ID没权限,用户自己读写运行。
如果文件打开成功,open 函数会返回一个文件描述符,以后对该文件的所有操作就可以通过对这个文件描述符进行操作来实现。
3. 读写
int read(int fd, const void* buf, size_t length);
int write(int fd, const void *buf, size_t length);
返回值为实际写入的字节数;fd为open函数返回的文件描述符;buf length 顾名思义。
4. 定位
对于随机文件,我们可以随机地指定位置读写,使用如下函数进行定位:
int lseek(int fd, offset_t offset, int whence);
- fd:文件描述符
- offset:相对于whence的偏移量
- whence:SEEK_SET:相对文件开头
- SEEK_CUR:相对文件读写指针的当前位置
- SEEK_END:相对文件末尾
5. 关闭
int close(int fd);
当我们操作完成以后,我们要关闭文件了,只要调用 close 就可以了,其中 fd 是我们要关闭的文件描述幅
6. 测试实例
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#define LENGTH 100
int main()
{
int fd, len;
char str[LENGTH];
fd = open("hello.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); /*创建并打开文件 */
if (fd) {
write(fd, "Hello World", strlen("Hello World")); /*写入字符串 */
close(fd);
}
fd = open("hello.txt", O_RDWR);
len = read(fd, str, LENGTH); /* 读取文件内容 */
str[len] = '\0';
printf("%s\n", str);
close(fd);
}
二、c库文件操作
C库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux,还是在 VxWorks 中都是这些函数
1. 创建与打开
FILE* fopen(const char* path, const char* mode);
mode: 打开模式
- r、rb 以只读方式打开
- w、wb 以只写方式打开。如果文件不存在,则创建该文件,否则文件被截断
- a、ab 以追加方式打开。如果文件不存在,则创建该文件
- r+、r+b、rb+ 以读写方式打开
- w+、w+b、wh+ 以读写方式打开。如果文件不存在时,创建新文件,否则文件被截断
- a+、a+b、ab+ 以读和追加方式打开。如果文件不存在,则创建新文件
其中 b 用于区分二进制文件和文本文件,这一点在 DOS、Windows 系统中是有区分的,但Linux 不区分二进制文件和文本文件。
2. 读写
C 库函数支持以字符、字符串等为单位,支持按照某种格式进行文件的读写,这一组函数为:
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char *fgets(char *s, int n, FILE *stream);
int fputs(const char *s, FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
int fscanf (FILE *stream, const char *format, ...);
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite (const void *ptr, size_t size, size_t n, FILE *stream);
fread()实现从流 stream 中读取加 n 个字段,每个字段为 size 字节,并将读取的字段放入 ptr所指的字符数组中,返回实际已读取的字段数。在读取的字段数小于 num 时,可能是在函数调用时出现错误,也可能是读到文件的结尾。所以要通过调用 feof()和 ferror()来判断。
write()实现从缓冲区 ptr 所指的数组中把 n 个字段写到流 stream 中,每个字段长为 size 个字节,返回实际写入的字段数。
另外,C 库函数还提供了读写过程中的定位能力,这些函数包括:
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, const fpos_t *pos);
int fseek(FILE *stream, long offset, int whence);
3. 关闭:
int fclose(FILE* stream);
4. 测试实例
#include <stdio.h>
int main()
{
FILE* fd;
char pr[15];
fd = fopen("hello.doc", "w+");
if (fd){
fputs("hello world", fd);
fcolse(fd);
}
fd = fopen("hello.doc", "r");
fgets(pr, 15, fd);
printf("%s\n", pr);
fclose(fd);
}
<<linux设备驱动开发详解>>
关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享