文件的打开及创建
SYNOPSIS
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
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 可读可写打开
当我们附带了权限后,打开的文件就只能按照这种权限来操作。
以上这三个常数中应当只指定一个。下列常数是可选择的:
O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。
O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错,一般用来判断文件是否已经存在。
O_APPEND 每次写时都加到文件的尾端,防止写入时把前面已有的内容覆盖掉。
O_TRUNC 属性取打开文件时,如果这个文件中本来是有内容的,而且为只读只写成功打开,则将其长度截断为0(把原有内容清空)。
文件权限
- 可读 r 4
- 可写 w 2
- 执行 x 1
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){
int fd;
fd = open("./file1",O_RDWR);//打开当前程序路径“file1”文件,可读可写方式打开
if(fd == -1){//文件打开成功返回>1的值,打开失败返回-1
printf("Open file1 failed\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);//可读可写:4+2
if(fd > 0){
printf("creat file1 success\n");
}
}
return 0;
}
文件写入操作
SYNOPSIS
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
fd:文件描述符 buf:无类型指针的缓冲区 count:写入文件的大小
write功能可以理解为将缓冲区buf的指针指向内存里面的数据,写“count”这么多个字节到fp(刚刚打开的文件)里,写入成功返回一个写入个数的整型数,写入失败返回-1。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(){
int fd;
char *buf = "Hello World!";
fd = open("./file1",O_RDWR);
if(fd == -1){
printf("Open file1 failed\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("creat file1 success\n");
}
}
printf("fd = %d\n",fd);
// ssize_t write(int fd, const void *buf, size_t count);
write(fd,buf,strlen(buf));
close(fd);
return 0;
}
文件读取操作
SYNOPSIS
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
从fd指向的文件读取“count”个字节的数据放到“buf”里。
文件读取时还需要注意光标移动的操作。
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
offset:偏移值 whence:固定点的位置
SEEK_SET 指向文件的头
SEEK_CUR 当前位置,偏移值整数往前移,复数往后移
SEEK_END 指向文件的尾
lseek调用成功返回文件大小(多少字节)。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(){
int fd;
char *buf = "Hello World!";
fd = open("./file1",O_RDWR);
if(fd == -1){
printf("Open file1 failed\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("creat sccess file1: fd = %d\n",fd);
}
}
// ssize_t write(int fd, const void *buf, size_t count);
int n_write = write(fd,buf,strlen(buf));
if(n_write != -1){
printf("write %d byte to the file1\n",n_write);
}
lseek(fd,0,SEEK_SET);//光标回到原点
char *readbuf;
readbuf = (char *)malloc(sizeof(char)*n_write + 2);
// ssize_t read(int fd, void *buf, size_t count);
int n_read = read(fd,readbuf,n_write);
printf("read %d context:%s\n",n_read,readbuf);
close(fd);
return 0;
}
创建文件create函数
int creat(const char *pathname, mode_t mode);
pathname:要创建的文件名(包含路径、缺省为当前路径)
mode:创建模式 //可读可写可执行
常见创建模式:
宏表示 | 数字 | |
S_IRUSR | 4 | 可读 |
S_IWUSR | 2 | 可写 |
S_IXUSR | 1 | 可执行 |
S_IRWXU | 7 | 可读、写、执行 |
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(){
int fd;
char *buf = "Hello World!";
fd = creat("/home/CLC/FILE/file2",S_IRWXU);
return 0;
}
Linux系统默认的文件描述符:
0 | 1 | 2 |
标准(键盘)输入 | 标准输出 | 标准错误 |
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(){
char readbuf[128];
int n_read = read(0,readbuf,5);//键盘输入
int n_write = write(1,readbuf,strlen(readbuf));//标准输出
printf("\ndone!\n");
return 0;
}
写结构体数组到文件
缓存区不是只有char类型,可以写整数,结构体等等,写入整数或结构体的文件打开是一串乱码而并不会影响系统对文件的判断。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
struct Test{
int a;
char b;
};
int main(){
int fd;
struct Test data[2] = {{100,'a'},{101,'b'}};
struct Test data2[2];
fd = open("./file3",O_RDWR);
write(fd,&data,sizeof(struct Test)*2);
lseek(fd,0,SEEK_SET);
int n_read = read(fd,&data2,sizeof(struct Test)*2);
printf("read %d\nread2 %c\n",data2[0].a,data2[0].b);
printf("read %d\nread2 %c\n",data2[1].a,data2[1].b);
close(fd);
return 0;
}