目录
知识点归纳
- 系统调用函数:open()、read()、write()、lseek()、close()
- I/O库函数:fopen()、fread()、fwrite()、flseek()、fclose()
每个I/O库函数的根都在对应的系统调用函数中
系统调用函数 | I/O库函数 | 作用 |
---|---|---|
open() | fopen() | 打开文件 |
read() | fread() | 读文件 |
write() | fwrite() | 写文件 |
lseek() | fseek() | 移动文件指针 |
close() | fclose() | 关闭文件 |
重点核心
fwrite()算法与fread()算法相似,只是数据传输方向不同。最开始,FILE结构体的内缓冲区是空的。在每次调用fwrite()时,它将数据写入内部缓冲区,并调整缓冲区的指针、计数器和状态变量,以跟踪缓冲区中的字节数。 如果缓冲区已满,则发出write()系统调用,将整个缓冲区写入操作系统内核。
I/O库模式
fopen()中的模式参数可以指定为:"r"、"w"、"a",分别代表读、写、追加。每个模式字符串可包含一个+号,表示同时读写,或者在写入、追加情况下,如果文件不存在则创建文件。
函数 | 功能 |
---|---|
fseek()、ftell()、rewind() | 更改文件流中的读/写字节位置。 |
feof()、ferr()、fileno() | 测试文件流状态。 |
fdopen() | 用文件描述符打开文件流。 |
freopen() | 以新名称重新打开现有的流。 |
setbuf()、 setvbuf() | 设置缓冲方案。 |
popen() | 创建管道,复刻子进程来调用sh。 |
-
文本文件操作
文本文件是以文本形式存储的文件,通常包含可读的字符数据。文本文件操作主要涉及字符读写、行读写和任意位置读写。 -
字符读写: 你可以使用标准库函数 fgetc() 和 fputc() 来逐字符读写文本文件。例如,你可以使用 fgetc() 读取文件中的字符,使用 fputc() 写入字符到文件。
-
行读写: 行读写通常涉及逐行处理文本文件。你可以使用 fgets() 函数来逐行读取文件的内容,或者使用 fprintf() 函数将文本写入文件。可以使用 fputs() 将字符串写入文件中。
-
任意位置读写: 若要在文本文件的任意位置读写,你可以使用 fseek() 函数设置文件指针的位置,然后使用 fread() 和 fwrite() 来读取或写入数据。
二进制文件操作
二进制文件是以二进制形式存储的文件,可以包含任意数据,包括非文本数据(如图像、音频等)。二进制文件操作主要涉及二进制数据的读写。
-
二进制数据的读写: 你可以使用 fread() 和 fwrite() 函数来读取和写入二进制数据。这些函数以字节为单位进行操作,因此非常适合处理二进制数据。
-
文件操作的基本流程
通常,你需要按照以下步骤执行文件操作: -
打开文件:使用 fopen() 函数打开文件,指定文件名和打开模式(读取、写入、追加等)。
-
执行文件操作:根据需求使用不同的读写函数进行操作,如 fread()、fwrite()、fgets()、fprintf() 等。
-
关闭文件:使用 fclose() 函数关闭文件,释放资源。
文本文件和二进制文件的转换
文本文件和二进制文件之间可以相互转换,但要注意转换可能导致数据格式的损失。
-
文本文件转二进制文件: 你可以逐行读取文本文件的内容,然后将其以二进制形式写入到二进制文件中,但要确保数据的正确转换。
-
二进制文件转文本文件: 对于二进制文件,你可以按照需要将其读取为字节流,然后将字节转换为字符,并将字符写入文本文件中。
数据结构的读写
读写数据结构通常涉及将数据结构的内容转换为二进制数据,然后写入到二进制文件,或者从二进制文件中读取二进制数据并还原为数据结构。
-
结构体的读写: 你可以使用 fwrite() 函数将结构体的内容写入二进制文件,然后使用 fread() 函数从二进制文件中读取数据并还原为结构体。
-
数据结构的文本表示: 如果需要将数据结构以文本形式保存,你可以编写自定义的函数来将结构体的字段转换为字符串,然后使用 fprintf() 函数将字符串写入文本文件。反之,你可以使用 fscanf() 函数读取文本文件的内容,并将其解析为结构体字段。
请注意,数据结构的读写涉及到数据的序列化和反序列化,需要小心处理数据的字节顺序(大端或小端)等问题,以确保数据的正确性。
苏格拉底挑战
问题与解决思路
针对文件路径和权限问题,我由于文件路径错误而无法打开文件,在仔细查看报错后,我发现是文件路径不对或未开管理员权限,正确改正路径,并给超级管理员权限后方可执行操作
实践过程
让chatgpt帮助我生成一份文件读写的代码,教会我如何用linux系统编写C语言程序
并利用一些常见的Linux命令,在虚拟机中练习:
ls - 列出目录中的文件和子目录。
pwd - 显示当前工作目录的完整路径。
cd - 更改当前工作目录。
cd 目录路径
mkdir - 创建新目录。
mkdir 新目录名
touch - 创建新文件。
touch 新文件名
cp - 复制文件或目录。
cp 源文件/目录 目标文件/目录
mv - 移动或重命名文件或目录。
mv 源文件/目录 目标文件/目录
rm - 删除文件或目录(请谨慎使用)。
rm 文件/目录
cat - 查看文件内容。
cat 文件名
less - 逐页查看文件内容,可以滚动查看。
==
less 文件名
head - 查看文件的前几行。
head 文件名
tail - 查看文件的末尾几行。
tail 文件名
grep - 在文本中搜索指定模式。
grep 模式 文件名
find - 查找文件或目录。
find 目录路径 -name 文件名
chmod - 更改文件或目录的权限。
chmod 权限设置 文件/目录
chown - 更改文件或目录的所有者。
chown 新所有者 文件/目录
ps - 显示当前运行的进程。
top - 实时监视系统性能和进程信息。
总结
C语言文件操作总结:
- 文件操作是通过C语言来实现对文件的读写、创建、编辑和删除等操作的过程。
- 可以使用标准库函数如 fopen()、fclose()、fread()、fwrite()、fgets()、fprintf() 等来进行文件操作。
- 文本文件和二进制文件是两种常见的文件类型,每种类型有不同的读写方式。
- 在文件操作中,要考虑数据结构的读写,需要了解数据的序列化和反序列化。
Markdown的优点总结:
- 简单易学:Markdown语法简单,容易上手,不需要复杂的标记或编程知识。
- 可读性强:Markdown文本很容易阅读,因为它的标记符号和格式化规则与文本的结构紧密相关。
- 平台无关:Markdown文本可以在任何支持Markdown的文本编辑器或平台上打开和编辑,不受特定应用程序的限制。
- 专注内容:Markdown让作者专注于内容创作,而不必过多关注格式和样式,因为格式化是自动处理的。
- 支持HTML嵌入:Markdown允许嵌入HTML标签,因此可以在需要时使用更高级的样式和功能。