Linux系统环境编程
1.文件编程
window如何手动修改文件 比如写一个word文档: Linux呢?
打开/创建文档 -> 编辑文档 -> 保存文档 -> 关闭文档
计算机如何帮助我们自动化完成以上操作
操作系统提供了一系列的API
如Linux系统:
打开 open
读写 write /read
光标定位 lseek
关闭 close
打开/创建文件
参数说明
Pathname:要打开的文件名(含路径,缺省为当前路径) Flags: O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开 当我们附带了权限后,打开的文件就只能按照这种权限来操作。
以上这三个常数中应当只指定一 个。下列常数是可选择的:
O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。 O_EXCL 如果同时指定了OCREAT,而文件已经存在,则出错。 O_APPEND 每次写时都加到文件的尾端。 O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0。
Mode:一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的访问权限。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
//int open(const char *pathname, int flags);
int fd;
fd= open ("./file0",O_RDWR);
return 0;
}
更改为
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
//int open(const char *pathname, int flags);
int fd;
fd= open ("./file0",O_RDWR);
if(fd == -1){
printf("fd = %d\n",fd);
fd = open("./file0",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("creat file0 success!\n");
printf("fd = %d\n",fd);
}
}
return 0;
}
创建文件creat函数
写入文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
//int open(const char *pathname, int flags);
int fd;
char *buf;
fd= open ("./file0",O_RDWR);
if(fd == -1){
printf("fd = %d\n",fd);
fd = open("./file0",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("creat file0 success!\n");
printf("fd = %d\n",fd);
}
}
printf("open file0 success!\n");
//ssize_t write(int fd, const void *buf, size_t count);
write(fd,buf,strlen(buf));
close(fd);
return 0;
}
读取文件
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
//int open(const char *pathname, int flags);
int fd;
char *buf = "mmm is my lover";
fd= open ("./file0",O_RDWR);
if(fd == -1){
printf("fd = %d\n",fd);
fd = open("./file0",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("creat file0 success!\n");
printf("fd = %d\n",fd);
}
}
printf("open file0 success!\n");
//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 success!\n");
}
close(fd);
fd= open ("./file0",O_RDWR);
char *readBuf;
readBuf = (char *)malloc(sizeof(char)*n_write+1);
// ssize_t read(int fd, void *buf, size_t count);
int n_read = read(fd, readBuf,n_write);
if(n_read != -1){
printf("read success!\n");
printf("read:%d,text:%s\n",n_read,readBuf);
}
close(fd);
return 0;
}
文件”光标”位置
将文件读写指针相对whence移动offset个字节
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
//int open(const char *pathname, int flags);
int fd;
char *buf = "mmm is my lover";
fd= open ("./file0",O_RDWR);
if(fd == -1){
printf("fd = %d\n",fd);
fd = open("./file0",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("creat file0 success!\n");
printf("fd = %d\n",fd);
}
}
printf("open file0 success!\n");
//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 success!\n");
}
// off_t lseek(int fd, off_t offset, int whence);
lseek(fd,0,SEEK_SET);
char *readBuf;
readBuf = (char *)malloc(sizeof(char)*n_write+1);
// ssize_t read(int fd, void *buf, size_t count);
int n_read = read(fd, readBuf,n_write);
if(n_read != -1){
printf("read success!\n");
printf("read:%d,text:%s\n",n_read,readBuf);
}
close(fd);
return 0;
}
关闭文件
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
//int open(const char *pathname, int flags);
int fd;
char *buf = "mmm is my lover";
fd= open ("./file0",O_RDWR);
if(fd == -1){
printf("fd = %d\n",fd);
fd = open("./file0",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("creat file0 success!\n");
printf("fd = %d\n",fd);
}
}
printf("open file0 success!\n");
//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 success!\n");
}
// off_t lseek(int fd, off_t offset, int whence);
int fileSize = lseek(fd,0,SEEK_END);
printf("file size is :%d\n",fileSize);
char *readBuf;
readBuf = (char *)malloc(sizeof(char)*n_write+1);
// ssize_t read(int fd, void *buf, size_t count);
int n_read = read(fd, readBuf,n_write);
if(n_read != -1){
printf("read success!\n");
printf("read:%d,text:%s\n",n_read,readBuf);
}
close(fd);
return 0;
}
文件编程的一般步骤
打开/创建文件 -> 读取文件/写入文件 -> 关闭文件
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char **argv)
{
int fdSrc;
char *readbuf;
int fdDes;
if(argc != 3){
printf("Param Error!\n");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR);
int size = lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readbuf = (char*)malloc(sizeof(char)*size + 8);
read(fdSrc, readbuf, size);
fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
write(fdDes,readbuf,strlen(readbuf));
close(fdSrc);
close(fdDes);
return 0;
}
文件编程练手1
实现linux cp命令的代码
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char **argv)
{
int fdSrc;
char *readbuf;
int fdDes;
if(argc != 3){
printf("Param Error!\n");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR);
int size = lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readbuf = (char*)malloc(sizeof(char)*size + 8);
read(fdSrc, readbuf, size);
fdDes = open(argv[2],O_RDWR|O_CREAT,0600);
write(fdDes,readbuf,strlen(readbuf));
close(fdSrc);
close(fdDes);
return 0;
}
文件编程练手2
配置文件的修改
//配置文件的修改,该demo10更改text.config文件里面LENG=3的值。
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char **argv)
{
int fdSrc;
char *readbuf;
if(argc != 2){
printf("Param Error!\n");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR);
int size = lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readbuf = (char*)malloc(sizeof(char)*size + 8);
read(fdSrc, readbuf, size);
char *p = strstr(readbuf,"LENG=");
if(p == NULL){
printf("Not Found!\n");
exit(-1);
}
p += strlen("LENG=");
*p = '8';
lseek(fdSrc,0,SEEK_SET);
write(fdSrc,readbuf,strlen(readbuf));
close(fdSrc);
return 0;
}
文件如何记录一个整数
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd = open("./file1",O_RDWR|O_TRUNC);
int data = 5;
int data1;
write(fd,&data,sizeof(int));
lseek(fd,0,SEEK_SET);
read(fd,&data1,sizeof(int));
printf("read : %d\n",data1);
close(fd);
return 0;
}
文件如何记录一个结构体
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
struct Test{
int a;
char c;
};
int main()
{
struct Test data = {5, 'a'};
struct Test data1;
int fd = open("./file1",O_RDWR|O_TRUNC);
write(fd,&data,sizeof(struct Test));
lseek(fd,0,SEEK_SET);
read(fd,&data1,sizeof(struct Test));
printf("read : %d,%c\n",data1.a,data1.c);
close(fd);
return 0;
}
文件如何记录一个结构体数组
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
struct Test{
int a;
char c;
};
int main()
{
struct Test data[2] ={ {5, 'a'},{100,'b'}};
struct Test data1[2];
int fd = open("./file1",O_RDWR|O_TRUNC);
write(fd,&data,sizeof(struct Test)*2);
lseek(fd,0,SEEK_SET);
read(fd,&data1,sizeof(struct Test)*2);
printf("read : %d,%c\n",data1[0].a,data1[0].c);
printf("read : %d,%c\n",data1[1].a,data1[1].c);
close(fd);
return 0;
}