目录
1 计算机的组成部分
硬件系统 |
软件系统 |
文件系统 |
1.1 硬件系统
控制器 |
运算器 |
存储器 |
输入设备 |
输出设备 |
中央处理器(CPU)=控制器+运算器
CPU:计算机中对信息进行高速运算处理的主要部件
主机=CPU+主存储器
存储器:存储程序、数据和文件、一般由快速的内部存储器(内存条)和慢速的外部存储器(固态硬盘)组成
外设=输入设备+输出设备+辅助存储器
1.2 软件系统
系统软件 | 计算机操作系统、硬件驱动系统 |
应用软件 | 用户可以使用的用程序设计的应用程序 |
1.3 文件系统
文件系统是一种标准或者是一种格式
常见的文件系统有:FAT32、NTFS、ext4
2、Linux的文件类型
1 | 普通文件 | - | regular | 存在外部存储中,存储普通数据 |
2 | 目录文件 | d | directory | 存放目录项 |
3 | 管道文件 | p | pipe | 进程间通信,也称为命名管道FIFO |
4 | 套接字文件 | s | socket | 网络间通信 |
5 | 链接文件 | l | link | 间接访问另一个目标文件 |
6 | 字符设备文件 | c | character | 字符设备在应用层的访问接口 |
7 | 块设备文件 | b | block | 块设备在应用层的访问接口 |
3、linux访问接口
3.1标准IO接口
//头文件
#include <stdio.h>
//Linux系统下该头文件路径为
/usr/include
//标准IO函数
fopen()
fread()
fwrite()
fclose()
fgetc()
fputc()
fgets()
fputs()
fprintf()
fscanf()
3.1.1 fopen——打开文件
//头文件
#include <stdio.h>
//函数原型
FILE *fopen(const char * pathname,const char * mode);
FILE *fdopen(int fd,const char * mode);
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
//函数参数
(1)filename: 文件名字符串
(2)mode:文件属性
r O_RDONLY 只读,要求文件必须存在
r+ O_RDWR 读写,要求文件必须存在
w O_WRONLY | O_CREAT | O_TRUNC 只写,如果不存在就创建新文件,如果存在就会将其内容清空
w+ O_RDWR | O_CREAT | O_TRUNC 读写,如果不存在就创建新文件,如果存在就会将其内容清空
a O_WRONLY | O_CREAT | O_APPEND 只写,如果不存在就创建新文件,且文件偏移量被自动定位到文件末尾(追加方式)
a+ O_RDWR | O_CREAT | O_APPEND 读写,如果不存在就创建新文件,且文件偏移量被自动定位到文件末尾(追加方式)
wa
rb
wb
ab
//函数返回值
打开文件成功,返回指向目标文件的文件流指针
打开文件失败,返回NULL
每一个被fopen函数打开的文件都会得到一个文件流指针
所以内核会为每一个被打开的文件都申请一块堆内存,用于存储文件的相关属性
并且内核会把所有被打开的文件形成一条链表
fseek(stream, 0, SEEK_END);
3.1.2 读取文件
1、按字符读取--fgetc()
//头文件
#include <stdio.h>
//函数原型
//从打开的文件的文件流指针中读取一个字符
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);//只能从标准输入中获取一个字符---等价于getc()
int ungetc(int c, FILE *stream);
//函数参数
stream 待读取数据的文件指针,会把得到的字符转换为字符对应的ANSCII码
//函数返回值
成功---读取到的字符
失败---如果已经到达文件末尾,函数会发出EOF标志;出现读错误也会返回EOF
//说明
标准库中提供了一个fgetc函数,通过C99标准可以知道该函数的作用是从文件指针stream指向的文件中读取一个字符,并在读取一个字节后把文件的光标位置向后移一个字节,然后把读取到的字符所对应的ASCII码通过返回值返回。
EOF是文件结束标志,其实是个宏定义,宏定义的值为 -1,在头文件libio.h中有相关描述。
#ifndef EOF
#define EOF (-1)
#endif
2、按行读取--fgets()
//头文件
#include <sys/ioctl.h>
//函数原型
//实际读取的字符数量为n-1,当遇到换行符或者遇到文件末尾结束
char *fgets(char *s, int size, FILE *stream);
char gets(char *s);
//函数参数
s 自定义缓冲区指针---数据缓存区
size 自定义缓冲区大小---准备读取的字符数量
stream 要读取数据的文件指针
//函数返回值
函数成功会返回 指向缓存区的指针
函数失败会返回 NULL
//备注
gets()缺省从文件stdin读取数据
当返回NULL时,文件stream可能已达末尾,或者遇到错误
3、按块读取--fread()
//头文件
#include <stdio.h>
//函数原型
//从参数stream指向的文件中读取nmemb块数据,每块大小是size,并把读取的数据存储到ptr指向的缓存区中
size_t fread(void * restrict ptr,size_t size,size_t nmemb, FILE * restrict stream);
//函数参数
ptr
存储数据的缓存区(自定义缓冲区指针)
nmemb
向指定文件中读取数据的块数(数据块个数)
size
读取的数据块每块数据的大小(数据块大小)
stream
stream指向的文件(即将被读取数据的文件指针)
//函数返回值
函数调用成功--返回读取的数据块的数量,
函数调用失败--返回0 (小于nmmb或等于0)
函数返回值小于0,可能出现读取错误或者到达文件末尾,如何区分
标准库提供了两个函数接口feof()和ferror()来区分
//1、feof()
//头文件
#include <stdio.h>
//函数原型
int feof(FILE *stream); //判断是否到达文件末尾
//返回值
返回值是非0值,则说明已经到达文件末尾
//2、ferror()
//头文件
#include <stdio.h>
//函数原型
int ferror(FILE *stream); //判断文件访问中是否出错
//返回值
函数返回值是非0值表示出错
4、 缓冲区--setbuf()--fflush()
//头文件
#include <stdio.h>
//函数原型
void setbuf(FILE * restrict stream,char * restrict buf);
//函数参数
stream
buf
//函数返回值
无返回值
手动刷新缓冲区
//头文件
#include <stdio.h>
//函数原型
int fflush(FILE *stream);
//函数参数
stream
//函数返回值
EOF
0
#define _IOFBF 0 全缓冲
#define _IOLBF 1 行缓冲
#define _IONBF 2 无缓冲
对于标准输出stdout而言默认是采用行缓冲的
而对于标准出错stderr而言默认是采用无缓冲的
对于普通文件而言默认是采用全缓冲的。
3.1.3写入文件
1、字符写入
(1)function:将一个字符写入指定文件中
(2)头文件:#include <stdio.h>
(3)函数原型
int fputc(int c,FILE *stream);
int putc(int c,FILE *stream);
int putchar(int c);
(4)函数参数
c 要写入的字符
stream 要写入的文件指针
(5)函数返回值
成功 写入到的字符
失败 EOF
2、按行写入
(1)function:将数据写入指定文件中
(2)头文件:#include <sys/ioctl.h>
(3)函数原型
int fputs(const char *s,FILE *stream);
int puts(const char *s,FILE *stream);
(4)函数参数
s 自定义缓冲区指针
stream 要写入数据的文件指针
(5)函数返回值
成功 非负整数
失败 EOF
3、按块写入
(1)function:将数据写入指定文件中
(2)头文件:#include <sys/ioctl.h>
(3)函数原型
size_t fwrite(const char *ptr,size_t size,size_t nmemb,FILE *stream);
(4)函数参数
ptr 自定义缓冲区指针
size 数据块大小
nmemb 数据块个数
stream 要写入数据的文件指针
(5)函数返回值
成功 写入的数据块个数,等于sinmembze
失败 写入的数据块个数,小于nmemb或等于0
3.1.4关闭文件
(1)function:关闭文件
(2)头文件:#include <stdio.h>
(3)函数原型
int fclose(FILE *stream);
(4)函数参数
stream 要关闭的文件
(5)函数返回值
成功 0
失败 EOF
3.1.5 移动文件
1、设置位移
//(1)note
每个打开文件的结构体中都有一个位置指示器
位置指示器是文件光标;被打开的文件的光标默认是在文件开头的
//(2)头文件
#include <stdio.h>
//(3)函数原型
int fseek(FILE *stream,long int offset,int whence);
//(4)参数
stream 要操作的文件指针
offset 偏移量
whence 光标位置
/(5)返回值
成功 返回0
2、获取位移
//(1)note
获取指定文件的位置指示器的当前值
//(2)头文件
#include <stdio.h>
//(3)函数原型
long int ftell(FILE *stream);
//(4)参数
stream 要操作的文件指针
//(5)返回值
成功 返回文件的位置指示器的当前值
3.1.6 格式访问
1、fprintf()
//常用的格式化函数:printf、fprintf、scanf、fscanf、sprintf、snprintf
//格式化字符串输出到某个文本
//(1)头文件
#include <stdio.h>
//(2)函数原型
int fprintf(FILE *restricet stream,const char *restrict format,.....);
//(3)函数参数
stream
//(4)函数返回值
成功 返回字符数量
2、sprintf()
//格式化字符串输出到某个文本
//(1)头文件
#include <stdio.h>
//(2)函数原型
int sprintf(char *restricet s,const char *restrict format,.....);
//(3)函数参数
s 数组或者堆内存
//(4)函数返回值
成功 返回字符数量
3.2系统IO接口
3.2.1 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);
int open(const char *pathname,mode_t mode);
//函数参数
(1)pathname--要打开的文件的路径,字符串常量
(2)flags
O_RDWR-----可读可写
O_RDONLY---只读
O_WRONLY---只写
追加模式----用位或(|)与上面的三个进行组合
O_APPEND
O_ASYNC
O_CLOEXEC
O_CREAT---如果文件不存在就创建
(3)mode---创建文件权限、且文件权限是八进制的,只有在创建文件的时候才可以使用
r-读
w-写
x-执行
//函数返回值
函数成功返回文件的描述符
函数失败返回-1
文件权限
3.2.2 close
//头文件
#include <unistd.h>
//函数原型
int close(int fd);
//函数参数
fd --- 关闭的文件描述符
//函数返回值
函数成功返回0
函数失败返回-1
3.2.3 read
//功能
从fd对应的文件中读取最多count个字节的数据并存储到buf指向的缓冲区中
//头文件
#include <unistd.h>
//函数原型
ssize_t read(int fd,void *buf,size_t count);
//函数参数
fd --- 需要读取的文件
buf---存储读取到的数据的缓冲区
count--读取数据的最大字节数
//函数返回值
返回值是读取的字节数量
如果返回值为0,说明读取到文件末尾
如果返回值是-1,则读取出错
3.2.4 write
//功能
将buf指向的缓冲区中的数据写入到fd对应的文件中,最多写入count个字节的数据
//头文件
#include <unistd.h>
//函数原型
ssize_t write(int fd,void *buf,size_t count);
//函数参数
fd --- 写入到的文件
buf---存储数据的缓冲区
count--需要写入数据的最大字节数
//函数返回值
返回值是写入的字节数量
如果返回值是-1,则写入出错
3.2.5位置偏移
//功能
设置文件的位置指示器的位移
//头文件
#include <unistd.h>
#include <sys/types.h>
//函数原型
off_t lseek(int fd,off_t offset,int whence);
//函数参数
fd ----- 文件名
offset---移动位数
whence---参考位置
SEEK_SET---文件开头
SEEK_CUR---当前位置
SEEK_END---文件末尾
//函数返回值
成功返回文件位置指示器相对于文件开头的偏移量
失败返回-1
3.2.6 ioctl--与驱动程序通信
//头文件
#include <sys/ioctl.h>
//函数原型
int ioctl(int fd, unsigned long request, ...);
//...表示变参,后面这个参数根据request来决定
//参数
int fd设备文件描述符
unsigned long request 请求命令 FBIOGET_VSCREENINFO
...与请求命令对应的参数 struct fb_var_screeninfo
//返回值
成功0
失败-1