农产品网站管理员怎么做,云南省建设项目申报网站,给网站开发APP,wordpress怎么找模板1.流和FILE对象 对于标准I/O库#xff0c;他们的操作是围绕流进行的。当用标准IO库打开或创建一个文件时#xff0c;我们已使一个流与一个文件相关联与标准I/O不同,非标准I/O不使用文件流来读取和写入文件,而是直接操作文件的文件描述符 (file descriptor) 。 非标准I/O通常提…1.流和FILE对象对于标准I/O库他们的操作是围绕流进行的。当用标准IO库打开或创建一个文件时我们已使一个流与一个文件相关联与标准I/O不同,非标准I/O不使用文件流来读取和写入文件,而是直接操作文件的文件描述符(file descriptor) 。非标准I/O通常提供以下函数或接口进行文件操作:·open: 用于打开文件,返回文件描述符。·read:从文件中读取数据。·write: 将数据写入文件。·lseek:设置文件的读写位置。·close: 关闭文件。标准IO vs. 文件IO系统调用特性标准IO文件IO系统调用接口级别高级封装了系统调用低级直接调用内核操作对象FILE *流指针文件描述符整数如0, 1, 2, 3...缓冲自动管理有三种模式无缓冲或需要用户自己管理缓冲区可移植性高符合C标准低不同Unix系统可能有细微差别性能通常更高因为缓冲减少了系统调用次数每次调用都是系统调用上下文切换开销大控制力相对较弱抽象程度高极强可以直接控制设备等2.缓冲(1)标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数04-Linux系统编程-第01天文件IO、阻塞非阻塞 - hh9515 - 博客园Linux系统编程 42 -系统调用和库函数的比较--预读入缓输出-CSDN博客read、 write 函数常常被称为 Unbuffered I/O。 指的是无用户级缓冲区。 但不保证不使用内核缓冲区。(2)标准IO提供了三种类型的缓冲标准I/O缓冲区通常位于运行内存RAM中。C标准库使用内存来分配和管理缓冲区。具体来说当你打开一个文件流通过fopen 函数时C标准库会为该文件流分配一个缓冲区并将该缓冲区与文件流相关联。这个缓冲区通常是使用操作系统提供的内存管理函数如mallo来动态分配的。操作系统提供了内存分配和释放的机制C标准库则利用这些机制来为文件流分配所需的内存空间。文件流的缓冲区大小可以通过函数setvbuf来设置你可以指定缓冲区的大小或选择使用标准库提供的默认大小。虽然标准I/O缓冲区位于运行内存中但它在实际应用中并不直接与物理文件进行读写。相反标准库将缓冲区作为中间存储区域当缓冲区被填满或满足一定条件时数据将从缓冲区复制到操作系统的文件缓存区中最终才会写入到物理文件中。(3)标准IO提供了三种类型的缓冲全缓冲在这种情况下当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。行缓冲:当在输入和输出中遇到换行符时执行真正的I/O操作。这时我们输入的字符先存放在缓冲区等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。不带缓冲:也就是不进行缓冲标准出错情况stderr是典型代表这使得出错信息可以直接尽快地显示出来。3.打开流fopenFILE *fopen(const char *filename, const char *mode);fdopen用于将一个已存在的文件描述符file descriptor转换为一个对应的文件流FILE *。4.读和写流1每次读一个字符的IOgetc 或 fgetc如果流是带缓冲的可以使用 getc 或 fgetc 函数进行每次一个字符的 I/O 操作。带缓冲的流意味着数据会先被读取到缓冲区然后一次性操作缓冲区中的数据可以提高 I/O 的效率。如果没有禁用流缓冲默认会使用缓冲区的数据每次调用 fgetc 都会从缓冲区中获取一个字符。当缓冲区被耗尽时会自动从文件中读取更多的数据进行填充。当缓冲区被耗尽时文件流会自动从文件中读取更多的数据来填充缓冲区。这样可以避免每次都直接与文件进行 I/O 操作以提高 I/O 的效率。默认情况下标准I/O库会负责管理文件流的缓冲区确保适当的数据量被从文件中读取到缓冲区中。当程序使用 fgetc 函数等来读取数据时如果缓冲区中的数据已经被耗尽标准I/O库会自动将更多数据从文件中读取到缓冲区。#include stdio.h int main() { FILE *file fopen(example.txt, r); if (file NULL) { perror(文件打开失败); return -1; } int ch; // 使用 fgetc 逐个字符读取 while ((ch fgetc(file)) ! EOF) { putchar(ch); } fclose(file); return 0; }2每次一行IOfgetsfgets 函数会从文件流 stream 中读取字符直到达到指定的最大长度 n-1 或者读取到换行符为止包括换行符然后将读取的字符串存储到 buffer 中并在末尾添加 null 字符来表示字符串的结束。6.二进制IOfread用于从文件读取二进制数据fread用于从文件读取二进制数据如何使用二进制 I/O 进行文件读取和写入#include stdio.h #include string.h typedef struct { int id; char name[50]; float score; } Student; // 写入结构体数组到文件 int write_students_to_file(const char *filename) { Student students[] { {1, 张三, 85.5}, {2, 李四, 92.0}, {3, 王五, 78.5} }; FILE *file fopen(filename, wb); if (!file) { perror(文件打开失败); return -1; } // 写入整个数组 size_t written fwrite(students, sizeof(Student), 3, file); printf(成功写入 %zu 个结构体\n, written); fclose(file); return 0; } // 从文件读取结构体数组 int read_students_from_file(const char *filename) { FILE *file fopen(filename, rb); if (!file) { perror(文件打开失败); return -1; } Student students[3]; size_t read fread(students, sizeof(Student), 3, file); printf(成功读取 %zu 个结构体\n, read); for (int i 0; i read; i) { printf(学生 %d: ID%d, 姓名%s, 分数%.1f\n, i1, students[i].id, students[i].name, students[i].score); } fclose(file); return 0; }二进制 vs 文本 I/O 对比特性二进制 I/O文本 I/O数据表示原始字节字符编码换行符处理不转换系统相关转换适用场景结构体、图片、音频等文本文件文件大小精确控制可能因编码而变化可读性不可直接阅读可直接阅读二进制IO的问题数据类型大小不一致填充和对齐问题平台兼容性问题字节序暂时记录到这里 2025年12月17日17:17:41