学习笔记 2
知识点总结
-
文件操作
文件操作涵盖了对文件的添加、删除、修改、打开、关闭等基本操作。 -
二进制文件和文本文件的转换
二进制转文本文件需要构建二进制转十六进制函数,按照每八位一组,每四位一单元进行转换。
反过来,文本文件转二进制文件需要构建十六进制转二进制函数。 -
数据结构的读写
可以通过fprintf()和fscanf()实现格式化的写入和读取。 -
I/O库函数
系统调用是文件操作的基础,但它们只支持数据块的读/写,不支持行、字符、结构化文件等逻辑单元的读/写。
I/O库函数是对系统调用的封装,提供了一系列方便使用且高效的文件操作函数。
系统调用函数:
open()
read()
write()
lseek()
close()
I/O库函数:
fopen()
fread()
fwrite()
fseek()
fclose()
每个I/O库函数的根都在对应的系统调用函数中,例如fopen()依赖于open,fread()依赖于read。
区别:
系统调用中,使用文件描述符(fd),打开失败返回1;每次迭代用read()调用读入buf[]再读到文件描述符中。
库I/O程序中,使用文件流指针(fp),失败返回NULL,否则返回FILE结构体地址,FILE结构体包含char fbuf[BLKSIZE]和整数fd字段。
I/O库函数的算法:
fread()发出read()系统调用来填充内部缓冲区。
fwrite()与fread()相似,只是数据传输方向不同。写满内部缓冲区后发出write()系统调用,将整个缓冲区写入操作系统内核。
fclose():如果以写的方式被打开,会先关闭文件流的局部缓冲区。然后发出close(fd)系统调用来关闭FILE结构体中的文件描述符。最后会释放FILE结构体,并将FILE指针重置为NULL。
5. I/O库模式
fopen中的模式 "r"、"w"、"a" 分别代表读、写、追加。
"r+"读/写,不会截断文件。
"w+"读/写,但会先截断文件;文件不存在会创建文件。
"a+"通过追加进行读/写;如果文件不存在,会创建文件。
6. 不同的I/O模式
字符模式I/O:fgetc()、ungetc()、fputc()
行模式I/O:char *fgets()、int fputs()
格式化I/O:fscanf()、fprintf()
7. 内存中的转换函数
sscanf()、sprintf()
8. 其他I/O库函数
fseek()、ftell()、rewind():更改文件流中的读/写字节位置。
feof()、ferr()、fileno():测试文件流状态。
fdopen():用文件描述符打开文件流。
freopen():以新名称重新打开现有的流。
setbuf()、setvbuf():设置缓冲方案。
popen():创建管道,复刻子进程来调用shell。
9. 限制混合fread-fwrite
规范要求每对fread()和fwrite()之间至少有一个fseek()或ftell()。
- 文件流缓冲
无缓冲 _IONBF 文件流 stderr
行缓冲 _IOLBUF 文件流 stdout
全缓冲 _IOFBUF 文件流 正常缓冲方案
最有收获的内容
对“宏”的理解:宏是一种预处理指令,可以用来替换源代码中的字符串。在条件编译中,可以方便程序员在调试程序的过程中执行一些在程序发布后不需要执行的指令。
宏函数的优点:避免了函数调用的时间和空间代价,提高了程序的效率。宏函数在预编译时会将定义的代码段嵌入到当前程序,不会产生函数调用,省去了保留现场和恢复现场的时间,但会占用额外的存储空间。
解决问题的思路
在学习过程中遇到问题,可以通过查阅资料、阅读相关文档或者询问他人来解决。同时,也可以尝试编写简单的示例代码来验证理解,从而深入理解知识点。
实践内容
以下是我完成的实践内容:
- 将文本中的小写字母转换为大写字母
原文本:
sql
Copy code
This is a test file.
It contains some lowercase letters.
运行后新文本:
sql
Copy code
THIS IS A TEST FILE.
IT CONTAINS SOME LOWERCASE LETTERS.
2. 在每行末尾标记行数
原文本:
arduino
Copy code
Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third line.
运行后新文本:
csharp
Copy code
Line 1: This is the first line.[1]
Line 2: This is the