目录
linux一切皆文件,上到程序,下到设备,因此文件编程是学习Linux一个重要的版块
Linux文件编程相关的函数
打开文件函数open()
文件描述符:当内核打开一个现有文件或创建一个新文件时,都会返回一个文件描述符,文文件描述符是一个小的非负整数
下面例程打开一个文件,并设置该文件的权限
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
if (argc < 2){
printf("missing file to open\n");
exit(-1);
}
int fd;
fd = open(argv[1], O_RDWR);
printf("fd is %d\n", fd);
if (fd == -1){
printf("open %s is fali\n", argv[1]);
fd = open(argv[1], O_RDWR | O_CREAT, 0600);
if (fd > 0){
printf("open file is success\n");
printf("fd is %d\n", fd);
}
}
return 0;
}
文件的权限
常见的文件权限有0600,0666,0777等等
命令chmod可以修改文件的权限
如为haozige.txt添加可执行的权限:
文件权限查看函数access()
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
if (argc < 2){
printf("missing file\n");
exit(-1);
}
if (access(argv[1], F_OK) == 0){
printf("file argv[1] is existence\n");
}else{
printf("file argv[1] is not existence\n");
}
return 0;
}
文件写入数据函数write()
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
if(argc < 2){
printf("missing file to open\n");
exit(-1);
}
int fd;
fd = open(argv[1],O_RDWR);
printf("fd is %d\n",fd);
if(fd == -1){
printf("open %s is fali\n",argv[1]);
fd = open(argv[1],O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("open file is success\n");
printf("fd is %d\n",fd);
}
}
//向文件写入数据
int writeSize;
char str[32] = "haozige or jiangxiaoya";
writeSize = write(fd,str,strlen(str));
if(writeSize < 0){
printf("file %s write data is fail\n",argv[1]);
}else if(writeSize == 0){
printf("write data is null\n");
}else{
printf("write %d data to file %s\n",writeSize,argv[1]);
}
return 0;
}
文件光标移动函数lseek()
文件写入数据后,光标一般停留在文件的末端,可以使用lseek()函数移动光标
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
if(argc < 2){
printf("missing file to open\n");
exit(-1);
}
int fd;
fd = open(argv[1],O_RDWR);
printf("fd is %d\n",fd);
if(fd == -1){
printf("open %s is fali\n",argv[1]);
fd = open(argv[1],O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("open file is success\n");
printf("fd is %d\n",fd);
}
}
//向文件写入数据
int writeSize;
char str[32] = "haozige or jiangxiaoya";
writeSize = write(fd,str,strlen(str));
if(writeSize < 0){
printf("file %s write data is fail\n",argv[1]);
}else if(writeSize == 0){
printf("write data is null\n");
}else{
printf("write %d data to file %s\n",writeSize,argv[1]);
}
//移动光标,获取文件长度
int fileSize;
lseek(fd,0,SEEK_SET);
fileSize = lseek(fd,0,SEEK_END);
if(fileSize < 0){
printf("cursor movement failed\n");
}else{
printf("file %s file size is %d\n",argv[1],fileSize);
}
return 0;
}
读取文件数据函数read()
在读文件之前一定要用lseek()函数将光标移动到文件开头
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
if(argc < 2){
printf("missing file to open\n");
exit(-1);
}
int fd;
fd = open(argv[1],O_RDWR);
printf("fd is %d\n",fd);
if(fd == -1){
printf("open %s is fali\n",argv[1]);
fd = open(argv[1],O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("open file is success\n");
printf("fd is %d\n",fd);
}
}
//向文件写入数据
int writeSize;
char str[32] = "haozige or jiangxiaoya";
writeSize = write(fd,str,strlen(str));
if(writeSize < 0){
printf("file %s write data is fail\n",argv[1]);
}else if(writeSize == 0){
printf("write data is null\n");
}else{
printf("write %d data to file %s\n",writeSize,argv[1]);
}
//移动光标,获取文件长度
int fileSize;
lseek(fd,0,SEEK_SET);
fileSize = lseek(fd,0,SEEK_END);
if(fileSize < 0){
printf("cursor movement failed\n");
}else{
printf("file %s file size is %d\n",argv[1],fileSize);
}
//读文件数据
lseek(fd,0,SEEK_SET);
int readSize;
char *readBuf;
readBuf = (char *)malloc(fileSize*sizeof(char));
readSize = read(fd,readBuf,fileSize);
if(readSize < 0){
printf("read file %s is fail\n",argv[1]);
}else{
printf("read %d data from file %s,content is %s\n",readSize,argv[1],readBuf);
}
return 0;
}
文件关闭函数close()
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
if(argc < 2){
printf("missing file to open\n");
exit(-1);
}
int fd;
fd = open(argv[1],O_RDWR);
printf("fd is %d\n",fd);
if(fd == -1){
printf("open %s is fali\n",argv[1]);
fd = open(argv[1],O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("open file is success\n");
printf("fd is %d\n",fd);
}
}
//向文件写入数据
int writeSize;
char str[32] = "haozige or jiangxiaoya";
writeSize = write(fd,str,strlen(str));
if(writeSize < 0){
printf("file %s write data is fail\n",argv[1]);
}else if(writeSize == 0){
printf("write data is null\n");
}else{
printf("write %d data to file %s\n",writeSize,argv[1]);
}
//移动光标,获取文件长度
int fileSize;
lseek(fd,0,SEEK_SET);
fileSize = lseek(fd,0,SEEK_END);
if(fileSize < 0){
printf("cursor movement failed\n");
}else{
printf("file %s file size is %d\n",argv[1],fileSize);
}
//读取文件数据
lseek(fd,0,SEEK_SET);
int readSize;
char *readBuf;
readBuf = (char *)malloc(fileSize*sizeof(char));
readSize = read(fd,readBuf,fileSize);
if(readSize < 0){
printf("read file %s is fail\n",argv[1]);
}else{
printf("read %d data from file %s,content is %s\n",readSize,argv[1],readBuf);
}
//关闭文件
close(fd);
return 0;
}