学习笔记2

发布时间 2023-09-17 22:25:03作者: LLLZT

知识点归纳

  • 系统调用函数: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标签,因此可以在需要时使用更高级的样式和功能。