第九章知识点:本章主要介绍了I/O库函数;解释了I/O库函数的作用及其相对于系统调用的优势;说明I/O库函数和系统调用之间的关系,并解释了它们之间的相似性和基本区别;详细介绍了I/O库函数的算法,重点介绍了fread、fwrite和fclose与read、write和close系统调用的交互;介绍了I/O库函数的不同模式;阐述了文件流缓冲方案;阐释了有不同参数的函数以及如何使用stdarg宏访问参数;以实现一个类printf函数的项目,根据格式字符串格式化打印不同数基的字符、字符串和数字。
部分文件操作总结:
1.使用ll / linux目录
2.与文件路径相关的符号意义
“.”:当前目录
"..":代表上一级目录“/”下一级目录
3.在linux中命令有很多的选项 命令可以认为是方法 选项可以认为是以什么方式方法去做这个命令或以什么方式方法呈现这个命令的最终结果。命令的格式都是 命令 选项(参数) 操作的文件或者是目录
4.相对路径和绝对路径
绝对路径:从最底层的根目录(/)开始访
相对路径:相对于当前位置而言
5.常用的命令
(1)ls :(list) -l 长格式的当前目录下的所有文件夹和文件的名称
(2)cat 文件路径 这是在查看某个文件里面的内容
(3)pwd 打印当前工作目录
(4)cd 路径 改变当前目录
6.创建文件和文件夹
touch 文件名 可以是在当前位置创建文件也可以进行绝对路径创建文件 但是递归创建文件是不可能的
mkdir -p 目录名 和文件一样 可以在当前位置和绝对路径中创建文件夹 -p属性代表递归创建文件夹 也就是说要设置成B文件夹在A文件夹下面的话 如果A文件夹还没有创建成则会先创建文件夹A再创建文件夹B
7.删除文件和文件夹
rm -r 文件夹的名字 -r表示删除的是目录
rm -f 文件夹的名字 -f表示免确认删除文件夹下面的文件和文件夹
rm -rf 文件夹的名字 表示免确认删除文件夹 而且删除的这个文件夹下面还有文件夹或者是文件
8.复制文件
cp 源文件路径 粘贴文件目标路径 路径可以是相对路径或者是绝对路径
9.重命名(移动)文件和重命名文件夹
mv 旧文件名 新文件名
10.查看文件信息
cat 文件路径 查看文件所有信息
more /less 都可以进行分页查看
head/tai 查看头部或者是尾部信息
Linux系统中二进制文件和文本文件如何转换:
在L inux中文本文件和二进制文件的处理上二者没有区别,例如在L inux中用fopen("a.txt","") (文本方式打开)和fopen("a. txt", "rb") (二进制方式打开)两个函数是一一样的。其实在系统内核中进行处理的时候都是按照二进制进行处理的,存也都是按照二进制进行存的,只是表现方式的不样而已
最有收获的内容:fread、fwrite和fclose与read、write和close系统调用详情
1. write系统调用
write,就是把缓冲区的数据写入文件中。注意,这里的文件时广泛意义的文件,比如写入磁盘、写入打印机等等。
Linux 中write()的函数原型:
size_t write(int fildes, const void *buf, size_t nbytes);
参数说明:
fildes:文件描述符,标识了要写入的目标文件。例如:fildes的值为1,就像标准输出写数据,也就是在显示屏上显示数据;如果为 2 ,则想标注错误写数据。
*buf:待写入的文件,是一个字符串指针。
nbytes:要写入的字符数。
函数返回值:size_t 返回成功写入文件的字符数。需要指出的是,write可能会报告说他写入的字节比你所要求的少。这并不一定是个错误。在程序中,你需要检查
error已发现错误,然后再次调用write写入剩余的数据。
2.read系统调用
系统调用read是从文件中读出数据。要读取的文件用文件描述符标识,数据读入一个事先定义好的缓冲区。他返回实际读入的字节数。
Linux中read的函数原型:
size_t read(int fildes, void *buf, size_t nbytes);
参数说明:
fildes:文件描述符,标识要读取的文件。如果为0,则从标准输入读数据。类似于scanf()的功能。
*buf:缓冲区,用来存储读入的数据。
nbytes:要读取的字符数。
返回值:size_t返回成功读取的字符数,它可能会小于请求的字节数。
3.open系统调用
系统调用open的作用是打开一个文件,并返回这个文件的描述符。
简单地说,open建立了一条到文件或设备的访问路径。如果操作成功,它将返回一个文件描述符,read和write等系统调用使用该文件描述符对文件或
设备进行操作。这个文件描述符是唯一的,他不会和任何其他运行中的进程共享。如果两个程序同时打开一个文件,会得到两个不同的问价描述符。
Linux中open的函数原型有两个:
int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode );
参数说明。
path:准备打开的文件或设备名字。
oflags:指出要打开文件的访问模式。open调用必须指定如下所示的文件访问模式之一:
open调用哈可以在oflags参数中包括下列可选模式的组合(用”按位或“操作):
O_APPEDN: 把写入数据追加在文件的末尾。
O_TRUNC: 把文件长度设为零,丢弃以后的内容。
O_CREAT: 如果需要,就按参数mode中给出的访问模式创建文件。
O_EXCL: 与O_CREAT一起调用,确保调用者创建出文件。使用这个模式可防止两个程序同时创建一个文件,如果文件已经存在,open调用将失败。
关于其他可能出现的oflags值,请看考open的调用手册。
mode:
当使用O_CREAT标志的open来创建文件时,我们必须使用三个参数格式的open调用。第三个参数mode 是几个标志按位OR后得到的。他们是:
S_IRUSR: 读权限,文件属主。
S_IWUSR:写权限,文件属主。
S_ IXUSR:执行权限,文件属主。
S_IRGRP:读权限,文件所属组。
S_IWGRP:写权限,文件所属组。
4.fopen函数
fopen函数类似于系统调用中的open函数。和open一样,它返回文件的标识符,只是这里叫做流(stream),在库函数里实现为一个指向文件的指针。
如果需要对设备的行为进行明确的控制,最好使用底层系统调用,因为这可以避免使用库函数带来的一些非预期的副作用,如输入/输出缓冲。
函数原型:
#include<stdio.h>
FILE *fopen(const char *filename, const char *mode);
参数说明:
*filename:打开文件的文件名
*mode:打开的方式
r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读数据。
rw+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
fopen在成功是返回一个非空的FILE *指针。失败返回NULL
5.fread/fwrite函数
fread函数从文件流中读取数据,对应于系统调用中的read;fwrite函数从文件流中写数据,对应于系统调用中的write
函数原型:
#include<stdio.h>
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
参数说明:
*ptr 要读取数据的缓冲区,也就是要存放读取数据的地方。
size:指定每个数据记录的长度。
nitems: 计数,给出要传输的记录个数。
返回值:成功读取到数据缓冲区的记录个数,当到达文件尾时,他的返回值可能会消耗与nitems,甚至可以是0
size_t fwrite(const coid *ptr, size_t size , size_t nitimes, FILE *stream);
他从指定的数据缓冲区ptr中把数据写入文件流,返回成功写入的记录个数。
6.fclose函数
fclose函数关闭指定的文件流stream,这个操作会使所有未写出的数据都写出。因为stdio库函数会对数据进行缓冲,所有调用fclose函数是很重要的。
如果程序需要确保数据已经全部写出,就应该调用fclose函数。虽然程序正常结束时,也会自动的调用fclose函数,但这样就不能检测出调用fclose所产生的错误了。
函数原型如下:
#include<stdio,h>
int fclose(FILE *stream);
问题:在进行二进制与文本文件操作时,忘记如何查看存储文件的二进制形式。
解决方法:翻找第一节课笔记,使用代码od -tx1 -tc
课堂笔记:
实践截图:将大写字母转化为小写字母
代码:
#include <stdio.h>
#define N 50
void main(void)
{
int ch;
int temp = 'a' -'A';
char string[N];
int index=0;
printf(">>");
while((ch=getchar()) != EOF && ch != '
' )
{
if( ch <= 'Z' && ch >= 'A' )
{
ch += temp;
}
string[index++] = ch;
}
string[index] = ' ';
printf( "return:%s
",string );
}