首页 > 其他分享 >yzy第二次学习笔记

yzy第二次学习笔记

时间:2023-09-17 12:56:32浏览次数:34  
标签:文件 int yzy 读写 笔记 文本文件 使用 第二次 库函数

第九章
I/O库函数
本章讨论了I/O库函数;结识了I/O库函数的作用及其对于系统调用的优势;使用示例程序来说明I/O库函数和系统调用之间的关系,并解释了他们之间的相似性和基本区别;详细介绍了IO库函数的算法,包括fread、 fwrite和fclose的算法,重点介绍了它们与read、write和close系统调用的交互;介绍了 I/O 库函数的不同模式,包括字符模式、行模式、结构化记录模式和格式化IO操作;阐述了文件流缓冲方案,并通过示例程序说明了不同缓冲方案的效果;阐释了有不同参数的函数以及如何使用stdarg宏访问参数。

系统调用是文件操作的基础,但它们至支持数据块的读/写。I/O库函数是一系列文件操作函数,既方便用户使用,又提高了整体效率。

9.2I/O库函数与系统调用
系统调用函数:open()、read()、write()、lseek()、close()
I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()

9.3I/O库函数算法
9.3.1fread算法
size_t fread(void* buff,size_t size,size_t count,FILE* stream)
作用:从文件中读入数据到指定的地址中

9.3.2fwrite算法
fwrite()函数以二进制方式向文件流中写入数据

9.3.3fclose算法
int fclose(FILE *stream)
功能:关闭一个文件流,使用fclose就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区

9.5I/O库模式
r :只读模式,1)文件必须存在。2)读指针指向文件开始处 3)调用write()会报错
w: 只写模式, 1)若文件不存在,创建文件。2)文件存在,清空文件。3)写指针指向文件开始处 。4)调用read()会报错
a: 追加模式(只写)1)若文件不存在,创建文件 。2)文件存在,不清空文件,而是在文件的结尾处继续写入 3)写指针直线文件结尾处 4)调用read()会报错
r+: 读写模式, 1)文件必须存在。2)打开可读写文件,读写指针均在文件头
w+: 读写模式 ,1)若文件不存在,创建文件。 2)若文件存在是可读写文件,清空文件。3)读写指针均在文件头
a+:读写模式 , 1)若文件不存在,创建文件。2)文件存在,不清空文件。3)读指针在开始位置,写指针在文件结尾位置
字符模式I/O:
int fgetc(FILE *fp); //get a char from fp, cast to int
int ungetc(int c, FILE *fp); //push a previously char got by fgetc() back to stream
int fput(int c, FILE *fp); //put a char to fp
行模式I/O:
char *fgets(char *buf,int size,FILE *fp):从fp中读取最多为一行(以\n结尾)的字符。
int fputs(char *buf,FILE *fp):将buf中的一行写入fp中。
格式化I/O:
格式化输入:(FMT=格式字符串)
scanf(char *FMT,&items);
fscanf(fp,char *FMT,&items)。
格式化输出: //这些大概是最常用的I/O函数
printf(char *FMT,items);
fprintf(fp,char *FMT,items)。
内存中的转换函数:sscanf()和sprintf

sscanf()和sprintf()并非I/O函数,而是内存中的数据转换函数。

其他I/O库函数
fseek()、ftell()、rewind():更改文件流中的读/写字节位置。
feof()、ferr()、fileno():测试文件流状态。
fdopen():用文件描述符打开文件流。
freopen():以新名称重新打开现有的流。
setbuf()、setvbuf():设置缓冲方案。
popen():创建管道,复刻子进程来调用sh。

文件流缓冲
每个文件流都有一个FILE结构体,其中包含一个内部缓冲区。对文件流进行读写需要遍历FILE结构体的内部缓冲区。文件流可以使用三种缓冲方案中的一种。

无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输。
行缓冲:遇到换行符时,写入行缓冲流的字符以块的形式传输。
全缓冲:写入全缓冲流或从中读取的字符以块大小传输到文件或从文件传输。这是文件流的正常缓冲方案。

变参函数
目前,C语言和C++会强制执行类型检查,但这两种语言仍然允许参数数量可变的函数。这些函数必须至少使用一个参数进行声明,后跟3个点,如

int func(int m, int n ...) //n = last specified parameter

在函数内部,可以通过C语言库宏访问参数:

void va_start(va_list ap,last); // start param list from last parameter
type va_arg(va_list ap, type); // type = next parameter type
va_end(va_list ap); // clear parameter list

问题
一.文本文件中考虑字符读写,行读写,任意位置读写等文件操作都有什么?

对文本文件进行字符读写、行读写和任意位置读写等文件操作,可以使用以下一些常见的方法和操作:

1.字符读写(Character-based I/O):

C 语言标准库函数:可以使用 fgetc() 和 fputc() 函数分别读取和写入单个字符。
Shell 命令行工具:可以使用 cat 命令将文本文件内容输出到终端,或使用重定向 < 和 > 操作符实现字符级别的输入与输出。

2.行读写(Line-based I/O):

C 语言标准库函数:可以使用 fgets() 函数逐行读取文本文件,并使用 fputs() 函数逐行写入文本文件。
Shell 命令行工具:可以使用 grep 命令进行文本搜索和过滤,以及 sed 命令进行文本替换和编辑。

3.任意位置读写(Random Access I/O):

C 语言标准库函数:可以使用 fseek() 和 ftell() 函数调整文件指针位置,并使用 fread() 和 fwrite() 函数实现任意位置的读写。
Shell 命令行工具:可以使用 dd 命令进行二进制文件的随机读写,通过指定 skip 和 seek 参数来移动文件指针。
除了上述方法外,还可以使用其他高级编程语言和工具来实现文件操作,例如 Python、Perl、Awk 等。这些工具和语言通常提供更多灵活和高级的文件操作功能,比如正则表达式匹配、文件锁定等。

需要注意的是,对于文本文件的读写操作,还要考虑文本编码(例如 UTF-8、ASCII 等)以及换行符的处理(例如 Linux 的 \n、Windows 的 \r\n)。在进行相关操作时,需要确认并正确处理文本编码和换行符的差异,以免出现错误或不一致的结果。

二.二进制文件和文本文件如何转换?

可以使用一些工具和方法来进行二进制文件和文本文件之间的转换。

1.二进制文件转文本文件:

使用 xxd 命令:xxd 命令可以将二进制文件转换为十六进制格式的文本文件。示例:xxd -p binaryfile > textfile.txt
使用其他自定义脚本/程序:你可以使用编程语言如 Python 或 Perl 编写自定义脚本来读取二进制文件,并将其转换为文本格式并保存为文本文件。

2.文本文件转二进制文件:

使用 xxd 命令:可以使用 xxd 命令的 -r 参数将十六进制格式的文本文件转换回二进制文件。示例: xxd -r -p textfile.txt binaryfile
使用其他自定义脚本/程序:你可以使用编程语言如 Python 或 Perl 编写自定义脚本来读取文本文件,并按照特定的格式将其转换为二进制文件。

注意事项:

在进行文本文件和二进制文件之间的转换时,需要确保数据的正确性和完整性。特别是对于二进制文件转文本文件,由于文本文件有字符数限制,可能会导致数据截断。
另外,不同的文件类型和格式可能需要使用不同的转换方法。例如,压缩文件(如 zip、tar)需要使用相应的解压工具进行解压缩,而不是直接进行文本和二进制的转换。
在使用任何转换工具或自定义脚本之前,建议备份原始文件,以防止误操作导致数据丢失。
请根据你的具体需求选择合适的方法,并确保在转换过程中保证数据的准确性和安全性。

三.数据结构如何读写?

读写数据结构可以通过以下几种常见的方法进行:

1.文件读写:将数据结构写入文件或从文件读取数据结构。可使用标准库函数(如 C 语言的 fwrite() 和 fread())或其他高级编程语言提供的文件读写功能。

2.网络传输:通过网络将数据结构发送到其他计算机或从其他计算机接收数据结构。可以使用网络编程库(如 C 语言的 socket 编程、Python 的 socket 模块等)来实现。

3.内存映射:将数据结构映射到内存中,可以直接在内存中读写数据结构,无需进行繁琐的文件读写操作。可使用 mmap 函数(C 语言中的 mmap,Python 中的 mmap 模块)实现内存映射。

4.数据库操作:将数据结构存储到数据库中,并通过数据库 API 进行读写。常见的数据库包括 MySQL、PostgreSQL、SQLite 等。你可以使用相应的数据库驱动和查询语言(如 SQL)进行数据结构的读写操作。

需要根据具体情况选择合适的方法。例如,如果数据结构较小且可以保存在常规文件中,文件读写是一种简单有效的方法。如果需要高性能的数据访问或并发访问,可以考虑使用内存映射或数据库操作。如果需要与其他计算机进行数据交换,网络传输是必要的。

此外,不同的编程语言和库会提供不同的方法和接口来读写数据结构,请根据具体编程环境选择相应的方式进行数据结构的读写操作。

标签:文件,int,yzy,读写,笔记,文本文件,使用,第二次,库函数
From: https://www.cnblogs.com/yzy3655921/p/17708310.html

相关文章

  • Unix/Linux系统编程学习笔记二
    学习笔记二一、教材知识点总结1.I/O库函数程序(1)fopen()使用字符串表示模式,其中"r"表示READ"w"表示WRITE。它返回一个指向FILE结构体的指针。fopen()首先发出open()系统调用来打开文件,以获取文件描述符编号fd。如果open0系统调用失败,则fopen()会返回一个NULL指针。否则,它会......
  • 学习笔记2
    对于C语言中的文件操作:字符读写:getc:从文件中读取一个字符。putc:将一个字符写入文件。行读写:fgets:从文件中读取一行文本。fputs:将一行文本写入文件。getline:动态地读取一行文本。任意位置读写:fseek:定位文件指针到指定位置。ftell:获取当前文件指针的位置。rew......
  • 《深入LINUX内核架构》学习笔记 ——01
    模块相关的知识1.模块相较于宏内核(微内核优点)模块消除了宏内核的许多限制,包括:缺乏动态可拓展性、导致内核映像尺寸膨胀、测试新特性时必须重启系统等。2.静态链接、动态链接及模块依赖(TIPS)《深入理解计算机系统》中有这样一段话:共享库是一个目标模块,在运行或加......
  • 第九章学习笔记
    Unix/Linux系统编程学习笔记第九章知识点归纳以及最有收获的内容I/O库函数知识点总结1.文件操作open()函数:用于打开文件,可以指定文件名、模式(读取、写入、追加等)以及编码。文件模式(mode):包括读取模式('r')、写入模式('w')、追加模式('a')、二进制模式('b')等。close()函数:用于关......
  • 第一周阅读笔记|人月神话
    阅读了前两章一个软件的实现,不仅仅是代码的完成,只是程序的完成还远远不够,更多的需要程序变成编程产品,这是可以被任何人运行、测试、修复和扩展的程序,它可以运行在多种操作系统平台上;同时程序还要变成编程系统,可以进行交互,并可以用来组装和搭建整个系统。最后成为编程系统产品,才是......
  • 学习笔记2
    ##I/O库函数-系统调用是文件操作的基础,但是它们只支持数据块的读/写。**I/O库函数和系统调用**-在Unix/Linux中,I/O库函数建立在系统调用的基础上。-相互关系系统调用函数:open()、read()、write()、lseek()、close();I/O库函数:fopen()、fread()、fwrit......
  • 梅科尔工作室-IoT-南向开发第五次培训笔记
    ADCAPI分析unsignedintIoTAdcRead(unsignedintchannel,unsignedshort*data,IotAdcEquModelSelequModel,IotAdcCurBaiscurBais,unsignedshortrstCnt);参数说明channel:表示ADC通道data:表示指向存储读取数据的地址的指针equModel:表示平均算法的次数......
  • openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据
    openGauss学习笔记-71openGauss数据库管理-创建和管理普通表-删除表中数据在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。SQL不能直接访问独立的行,只能通过声明被删除行匹配的条件进行。如果表中有一个主键,用户可以指定准确的行。用户可以删除匹配......
  • C++ 学习笔记、01 | 开发简单职工管理系统遇到的一些问题
    记录开发简单职工管理系统遇到的一些问题,黑马教程https://www.bilibili.com/video/BV1et411b73ZP147~P166头文件与源文件头文件只声明,源文件来实现(本质上是类内声明类外实现)源文件需要引用特定的头文件ifndefOOPFINAL_WORKER_H#defineOOPFINAL_WORKER_H#include<......
  • 算法学习笔记(mkdir
    算法学习笔记数据结构图论树上问题欧拉序图上问题kruskal重构树数论数论分块......