学习linux第一章便是文件操作,为什么呢,也许这就是和windows不同的魅力吧,键盘操作成为linux的主流,一行行指令也就需要我们所熟悉,记住记不住就靠脑子了,但是笔记还是做做的好哈。
主要想先记几个常用API:
1.文件打开open()
linux中man 2 open即可查询:
#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);
例如:fd = open("./file1",O_RDWR);打开本目录文件file1,可读可写;
fd = open("./file1",O_RDWR|O_CREAT,0600);若file1不存在,则通过O_CREAT创建,并以0600(可读可写)方式。
注:上述fd为文件描述符,是文件操作中很重要是的一个操作符,贯穿文件。
flags除了O_RDWR还有O_RDONLY只读、O_WRONLY只写。
权限解释:为什么是0600的模式来创建文件呢?0600什么意思?
权限:
1.可读 4
2.可写 2
3.执行 1
0600中的6就代表可读可写,后面两个0分别代表同组和其他组的访问。
2.文件读取read()
linux中man 2 read即可查询:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd为文件描述符、buf为缓冲区,就是读取的文件内容放入的地方,一般char *buf;count为读取大小,sizeof或者strlen()均可。
char *readBuf;
readBuf = (char *)malloc(sizeof(char)*n_write);
int n_read = read(fd,readBuf,n_write);
3.文件写入write()
linux中man 2 write即可查询:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
fd为文件描述符、buf为缓冲区,就是写入的内容所指的地方,一般char *buf;count为读取大小,sizeof或者strlen()均可。
int n_write = write(3,buf,strlen(buf));
注:读取和写入的返回值为int,-1代表错误。
4. APPEND和TRUNC
fd = open("./file3",O_RDWR|O_APPEND,0600);
fd = open("./file3",O_RDWR|O_TRUNC,0600);
APPEND为在该文件后续写;
TRUNC为覆盖原文件;
5.文件光标移动函数ISEEK()
int size = lseek(fd,0,SEEK_END); //光标移动到文件尾巴,一般用于记录什么呢,记录文件大小;
lseek(fd,0,SEEK_SET); //光标移动到开头;
6.文件写入一个结构体,再读出来
struct Test data1[2] = {{100,‘w’},{200,‘l’}};
struct Test data2[2];
int n_write = write(fd,&data1,sizeof(struct Test)*2);
int n_read = read(fd,&data2,sizeof(struct Test)*2);
7.int main(int argc,char** argv)
这是主函数的一种形式,在文件操作中,一般用于./a.out文件传参,argv[1],argv[2]等等;
8.前面所讲的都是linux操作文件的API,在这里,还有C语言本身关于文件操作的API,这种API是基于流的吧…好像吧…具体没有深入研究,但是其速度是较linux快一些
9.fopen()
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
p = fopen("./wyy.txt",“w+”);
它的返回值是FILE型的指针,所以一般应以FILE *p = NULL;
10.fread()和fwrite()
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
fwrite(buf,sizeof(char),strlen(buf),p);
fseek(p,0,SEEK_SET);
fread(readbuf,sizeof(char),strlen(buf),p);
也是同样定义一个buf缓冲区,之后机型一系列操作。