第九章
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