文件(打开关闭读写) C语言

一、文件


二、打开文件 关闭文件

FILE *fopen(const char *path, const char *mode);

**功能:**打开文件,获得对应的流指针数:

"r" 只读方式,文件必须存在,不存在则报错

"r+" 读写方式,文件必须存在,不存在则报错的空文件的空文件

"w" 只写方式,文件存在时,截短为 0 ,不存在,则创建 -->创建了一个新文件

"w+" 读写方式,文件存在时,截短为 0 ,不存在,则创建 -->创建了一个新文件

"a" 追加(写),文件存在时,从文件末尾开始写,文件不存在时,则新建一个文件

"a+" 追加(读写),文件存在时,从文件末尾开始写,文件不存在时,则新建一个文件

对二进制文件:

"rb" "rb+" "wb" "wb+" "ab" "ab+"

返回值:

成功 FILE 指针

失败 NULL


fclose(FILE *)

p.s.

当开始运行一个 C 程序时,系统将会负责自动打开三个文件: 标准输入 标准输出 标准出错

与之对应的指针分别为:stdin stdout stderr

这三个指针都是常量通常情况下:

标准输入---一般与键盘连接

标准输出 标准出错-- 与终端屏幕连接

打开关闭文件:


三、读、写(文件的定位)

1、按字符读写

读:(从文件中读取一个字符)

int fgetc(FILE *stream);

**功能:**从指定的流文件中获得字符参数:

@stream 指定的文件指针

返回值:

成功 返回 对应字符的 ascii值

失败 EOF (文件结束)error(错误) 都是-1

区分: eof 还是error

//检查对应文件的状态(eof error)

int feof(FILE *stream);//如果对应的文件数据到达文件结尾(eof),则该函数的返回值为非 0 值

int ferror(FILE *stream); //如果对应的文件数据出错,则该函数的返回值为非 0 值


读取单个字符:

循环读取单个字符到文件结尾:

另一种写法:


2、写:(往指定文件中写入一个字符)

int fputc(@c,FILE *stream);

功能:

实现字符输出参数:

@c 要输入的字符

@stream 指定的输入文件对应的文件指针

返回值:

成功 写入的字符对应的 ascii 码

失败 EOF

写入单个字符:


3、按行读写,按字符串进行读写

读:(从文件中读取一行字符串)

char *fgets(char *s, int size, FILE *stream);

**功能:**获取字符(串) 参数:

@s 自己开辟的一块内存空间的首地址(用来保存获取到数据)

@size 一次 fgets 操作期望读取到的最大字符个数

@stream 指定的输入文件的文件指针返回

返回值:

成功 s

失败NULL

文件结尾NULL

读取结束:

(1) EOF

(2)'\n'

(3)size

'\n' 的处理:fgets 会将 '\n' 保存到buffer 中去

buffer:缓冲器

每次读取结束 最后都会添加一个 '\0',保证是一个字符串

fgets 一次最多能读取 size - 1个字符

读取一行字符串:

写:

int fputs(const char *s, FILE *stream); // 将 s 指定的字符串输出到 stream 指定的文

件中

fputs 不会将'\0'进行输出,遇到'\0'就输出

4、按对象读写(二进制的读写)

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

对象: --> 可以指定按什么数据类型进行操作(int char short 结构体等)

参数:

@ptr 保存数据的

@size 单个对象的大小 sizeof(对象类型)

@nmemb 一次期望操作的对象个数

@stream 要操作的流文件

返回值:

成功 返回值 成功操作的 对象个数

失败 0

注意:

一次操作的字节数 = 成功操作的对象个数 * 单个对象的大小

如果想完整的读取到文件的内容,文件中没有固定的数据格式时, 最好按char 来读。

读写一组数据:


四、文件定位:

int fseek(FILE *stream, long offset, int whence);

**功能:**设置 offset 的值,实现定位

参数:

@stream 要定位的文件指针

@offset 偏移值

@whence 相对的偏移起点

SEEK_SET 从文件开头偏移(0) offset >= 0

SEEK_CUR 当前位置(1) offset 可正可负

SEEK_END 文件结尾(2) offset 可正可负

返回值:

成功 0

失败**-1** &error 置位

eg:

//从文件开头偏移 100 个字节

fseek(fp,100,SEEK_SET);

//从当前位置 往后偏移 100 字节

fseek(fp,100,SEEK_CUR);

//从当前位置 往前偏移 100 字节

fseek(fp,-100,SEEK_CUR);

//从文件尾部位置 往后偏移100 字节------- >相当于在源文件的基础上又扩充了100 个字节

fseek(fp,100,SEEK_END);

**重定位:**大小可以通过计算获得

相关推荐
Eiceblue15 分钟前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
tan180°43 分钟前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
m0_555762901 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
学不动CV了1 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
浪裡遊2 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
彭祥.2 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk2 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
好开心啊没烦恼3 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
猫猫的小茶馆3 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
简佐义的博客3 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang