常用标准IO:fopen、fclose、fread、fwrite、fseek 学习、使用

您所在的位置:网站首页 7015标准节代码 常用标准IO:fopen、fclose、fread、fwrite、fseek 学习、使用

常用标准IO:fopen、fclose、fread、fwrite、fseek 学习、使用

2023-08-08 19:28| 来源: 网络整理| 查看: 265

系统调用IO函数open,close等都是围绕着文件描述符fd进行相关操作的。 当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的IO操作。

open系列函数fopen系列函数常用于打开设备文件常用于打开普通文件可以指定要创建文件的访问权限不能指定要创建文件的访问权限open返回一个文件描述符fopen返回一个文件指针利用文件描述符操纵文件利用文件指针操作文件POSIX系统调用ANSI C库函数低层次IO高层次IO,对open的扩展和封装只能在POSIX操作系统上移植可移植到任何操作系统非缓冲IO带缓冲IO只能读取二进制或普通文本可以读取一个结构

而当用C库标准IO函数(fopen、fclose、fread、fwrite、fseek等)打开或创建一个文件时,我们已使一个==流(FILE *stream)==与一个文件相关联了。

fopen打开流

FILE *stream, 文件指针,FILE结构体又被称作流。

#include /* * @description : 打开一个文件 * @param - path : 指定文件路径,如:"./test.txt" * @param - mode :指定文件的打开方式,如下图: * @return : 成功,返回指向该文件的文件指针; 若失败,返回 NULL */ FILE *fopen(const char *path, const char *mode);

mode参数:

mode说明“r”打开文本文件用于读“w”创建文本文件用于写,并删除已存在的内容(如果有的话)“a”添加;打开或创建文本文件用于在文件末尾写“rb”打开二进制文件用于读“wb”创建二进制文件用于写,并删除已存在的内容(如果有的话)“ab”添加;打开或创建二进制文件用于在文件末尾写“r+”打开文本文件用于更新(即读和写)“w+”创建文本文件用于更新,并删除已存在的内容(如果有的话)“a+”添加;打开或创建文本文件用于更新和在文件末尾写"rb+“或"r+b”打开二进制文件用于更新(即读和写)"wb+“或"w+b”创建二进制文件用于更新,并删除已存在的内容(如果有的话)"ab+“或"a+b”添加;打开或创建二进制文件用于更新和在文件末尾写

当打开一个流时,标准IO函数fopen返回一个指向FILE对象的指针( 文件指针)。 该对象通常是一个结构,它包含了标准IO库为管理该流需要的所有信息(流), 包括用于实际IO 的文件描述符、指向用于该流缓冲区的指针、缓冲区的长度、当前在缓冲区中的字符数以及出错标志等。 为了引用一个流,需将FILE 指针作为参数传递给每个标准IO函数。

fclose关闭流 #include /* * @description : 关闭一个已打开的流 * @param - stream :文件指针(流) * @return : 成功,返回0; 若失败,返回EOF */ int fclose(FILE *stream); //stream指定的是要关闭的流(文件指针) //成功返回0;若出错,返回EOF

在该文件被关闭之前,冲洗缓冲中的输出数据。 缓冲区中的任何输入数据被丢弃。如果标准I/O库已经为该流自动分配了一个缓冲区,则释放此缓冲区。 当一个进程正常终止时(直接调用exit函数,或从main函数返回), 则所有带未写缓冲数据的标准IO流都被冲洗,所有打开的标准IO流都被关闭。

fwrite对打开的流写入 #include /* * @description : 对已打开的流进行写入数据块 * @param - ptr :指向 数据块的指针 * @param - size :指定写入的每个数据项的字节数,如调用sizeof(char) * @param - nmemb : 指定写入的数据项的个数 * @param - stream :要写入的文件流 * @return : 返回实际写入的数据项的个数 */ size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); fread对打开的流进行读取 #include /* * @description : 对已打开的流进行数据读取 * @param - ptr :指向 数据块的指针 * @param - size :指定读取的每个数据项的字节数 * @param - nmemb : 指定要读取的数据项的个数 * @param - stream :要读取的文件流 * @return : 返回实际读取数据项的个数; */ size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

fwrite、fread不能区分文件结尾和错误,调用者必须使用feof函数和ferror函数来确定发生了什么。恩…

fseek定位流 #include /* * @description : 重定位文件指针位置 * @param - stream :指定重定位文件指针 * @param - offset :指定偏移量,整数表示正向偏移,负数表示负向偏移 * @param - whence : 指定偏移基准位置,如:宏SEEK_CUR(当前位置)、 SEEK_END(文件结尾) 或 SEEK_SET(文件开头) * @return : 成功,返回0; 若失败,返回-1,且不改变指针位置。 */ int fseek(FILE *stream, long offset, int whence); demo.c #include #include int main(void) { FILE *fp = NULL; int ret; char *str = "hello chenchenchen"; char readBuf[128] = {0}; fp = fopen("./test.txt", "a+"); if(fp == NULL){ printf("Can't fopen file\n"); return -1; } printf("fopen file success\n"); ret = fwrite(str, sizeof(char),strlen(str),fp); printf("fwrite byte = %d\n",ret); ret = fseek(fp,0,SEEK_SET); if(ret == 0) printf("fseek success\n"); ret = fread(readBuf,sizeof(char),strlen(str),fp); printf("fread byte=%d, readBuf= %s\n",ret,readBuf); ret = fclose(fp); if(ret


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3