两种典型的操作系统:vxworks风河操作系统
Linux操作系统:源码开源
文件操作的概念
应用层通过API接口来操作linux操作系统
系统调用函数
1、 creat
函数的作用:创建一个文件
函数的原型:int creat(const char *pathname, mode_t mode)
头文件:#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
返回值:成功:新的文件描述符
出错:-1
2、 open
函数的作用:打开一个文件
函数的原型:int open(const char *pathname, int flags);
Int open(const char *pathname, int flags, mode_t mode);
头文件:#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
返回值:成功:文件描述符
出错:-1
参数说明:
Flags: O_CREAT 如果文件原来不存在,有这个参数可以创建文件
O_RDONLY 设置文件属性为可读
O_WRONLY 设置文件属性为可写
O_APPEND 如果文件原来就有内容,则会自动保留文件
O_TRUNC 清空原来内容
3、 read
函数的作用:从打开的文件中读取数据
函数的原型:ssize_t read(int fd , void*buf, size_t count)
头文件:#include <unistd.h>
返回值:正常返回是实际读到的字节数;
如果是在文件结束或者无数据,返回0;
出错:-1
4、 write
函数的作用:向打开的文件中写数据
函数的原型:ssize_t write(int fd, const char *buf, size_t count)
头文件:#include <unistd.h>
返回值:如果顺利成功会返回实际写入的字节数;
出错:-1;
5、 lseek
函数的作用:进行文件定位
函数的原型:int lseek(int fd, offset_t offset , int whence)
参数说明:fd :文件描述符
offset:指针的微调,在指定的位置向前移动为负,向后移动为正
whence:SEEK_SET 放在文件头
SEEK_CUR 当前的位置
SEEK_END 放在文件尾
返回值:返回文件当前指针到文件开始的地方有多少字节;
出错:-1;
库函数—创建和打开
1、 fopen
函数的作用:打开文件
函数的原型:FILE *open(const char *pth, const char *mode)
参数说明:
Mode:
r:读,文件必须存在
r+:打开可读写,文件必须存在
w:打开只写文件,文件存在,清零原文件;文件不存在就会创建文件
w+:打开可读写文件,文件存在,清零原文件;文件不存在就会创建文件
a:以附加的形式打开只写文件,不存在就创建文件,存在就写到原来的文件尾
a+:以附加的形式打开可读写文件,不存在就创建文件,存在就写到原来的文件尾
b:二进制文件
头文件:#include <stdio.h>
返回值:成功是指向文件流的指针
出错返回NULL;
2、 fputc
函数的作用:将一个指定的字符写入文件流中
函数的原型:int fputc( int c, FILE *stream)
返回值:成功:返回写入的字符c
如果返回EOF则返回失败
3、 fgetc
函数的作用:从文件流中读取一个字符
函数原型:int fgetc(FILE *stream)
返回值:返回值正常的是读取的字符
EOF表示到了文件尾
4、 fputs
函数的作用:将一个字符串写入到文件内
函数的原型:int fputs(const char *s,FILE *stream)
返回值:成功返回写成功字符串;
如返回EOF表示出错;
5、 fgets
函数的作用:从文件流中读取一个字符串
函数的原型:int fgets(char *s,int size,FILE *stream)
函数的参数:从stream中读size-1个字符到s中
返回值:成功返回s;
出错返回NULL;
6、 fread
函数的作用:从文件流读取数据块
函数的原型:size_t fread(void *ptr,size_t size, size_t nmemb,FILE *stream)
返回值:实际读到的数据块的数目
注:如果返回值比nmemb小的话,可能是到了文件尾或者错误发生
feof : 到了文件尾;
ferror:错误发生
7、 fwrite
函数的作用:将数据块写到文件流中
函数的原型:size_t fwite(const void*ptr,size_t size,size_t nmemb, FILE *stream)
返回值:实际写入的nmemb数目
8、 fseek
函数的作用:移动文件流的读写位置
函数的原型:int fseek(FILE *stream,long offset , int whence)
返回值:成功返回0,出错返回-1
9、 ftell
函数的作用:读取文件流的读取位置
函数的原型:long ftell(FILE *stream)
返回值:成功返回当前的读写位置;
出错-1;
10、feof
函数的作用:检查文件流是否到了文件尾
函数的原型:int feof(FILE *stream)
返回值:非零代表到了文件尾
11、fprintf
函数的作用:格式化数据到文件
函数的原型:int fprintf(FILE *stream,char *format,…);
返回值:成功返回实际输入的字符;
出错-1;
12、fscanf
函数的作用:格式化字符串输入
函数的原型:int fscanf(FILE *stream,const char *format,…);
返回值:成功返回参数的数目;
出错-1;
文件编程学习总结:
1、创建文件有哪些方式?
(1) 调用creat()函数
(2) 调用open()函数,并将参数flag设置为O_CREAT
(3) 调用fopen()函数,将参数mode设置为r+/w/w+
2、如何确定一个文件的大小?
(1)调用lseek()函数,将offset参数设置为0,将whence参数设置为文件尾即SEEK_END,函数的返回值即为文件的大小
(2)调用fseek()函数,将offset参数设置为0,将whence参数设置为文件尾,再调用ftell()函数,ftell()函数的返回值即为文件的大小
3、如何判断一个文件是否已经到达文件尾?
(1)调用read()函数,如果返回0,那么表示文件已经结束或者是无数据
(2) 调用feof()函数,如果返回值为非零则表示已经到达文件尾
4、在linux操作系统中为什么不允许用户访问内核数据?
在linux中,为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间,他们分别运行在不同的级别上,在逻辑上是相互隔离的,因此,用户进程在通常情况下不允许访问内核数据