文件操作

文件指针

操作系统通过 函数(API) 操作文件,而函数通过文件指针识别不同文件

函数 --> 文件指针 --> 文件

打开和关闭文件

fopen打开文件

#include

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

功能:打开文件

参数:

filename:文件名

mode:打开文件的模式

返回值:

成功:文件指针

失败:NULL

mode的赋值:

r只读,w只写,b二进制文件,a追加,+可读可写

附:

FILE的定义:

struct _iobuf {

char *_ptr;

int _cnt;

char *_base;

int _flag;

int _file;

int _charbuf;

int _bufsiz;

char *_tmpfname;

};

typedef struct _iobuf FILE;

fclose关闭文件

#include

int fclose(FILE *stream);

功能:关闭fopen打开的文件,将缓冲区的数据写入文件中,

并释放系统提供的文件资源

参数:

stream:文件指针

返回:

成功:0

失败:-1

例:

#include

#include

int main() {

FILE *fp = NULL;

fp = fopen("./tes","rb");

if (fp == NULL)

{

perror("fopen");

exit(1);

}

printf("打开成功\n");

fclose(fp);

return 0;

}

# 当test文件存在时

打开成功

# 当不存在时

fopen: No such file or directory

文件读写

fputc往文件写一个字符

#include

int fputc(int ch,FILE *stream);

功能:将ch转换为unsigned char后写入stream文件中

参数:

ch:字符

stream:文件指针

返回:

成功:成功写入文件的字符

失败:返回-1

例:

fgetc读取一个字符

#include

int fgetc(FILE *stream);

功能:从stream指定的文件里读取一个字符

参数:

stream:文件指针

返回:

成功:读取到的字符

失败:-1

判断文件结束

EOF 宏 -1 文本文件

feof 函数 文本文件和二进制文件

int feof(FILE *stream);

功能:检测是否读到了文件结尾。判断的是最后一次“读操作的

内容”,不是当前位置内容(上一个内容)

参数:

stream:文件指针

返回:

非0值:已经到文件结尾

0:未到文件结尾

例:

#include

#include

int main() {

FILE *fp = NULL;

fp = fopen("./hello.txt","r");

if (fp == NULL)

{

perror("fopen");

exit(1);

}

// 操作文件

while (1) {

char ch = 0;

ch = fgetc(fp);

// 判断文件末尾

// EOF

// if (ch == EOF)

// {

//break;

// }

if (feof(fp)) {

break;

}

printf("%c",ch);

}

printf("\n");

fclose(fp);

return 0;

}

Hello file

实例1:二进制文件读取器

#include

#include

int main(int argc, char *argv[])

{

if (argc < 2)

{

printf("ERROR:参数过少。。。");

exit(1);

}

else if (argc > 2)

{

printf("ERROR:参数过多。。。");

exit(1);

}

else

{

FILE *fp = NULL;

fp = fopen(argv[1], "rb");

if (fp == NULL)

{

perror("fopen");

exit(1);

}

while (1)

{

char ch = 0;

ch = fgetc(fp);

if (feof(fp))

{

printf("\n");

break;

}

printf("%-#x\t", ch);

}

}

return 0;

}

效果:

fputs写入字符串

int fputs(const char *str,FILE *stream);

功能:将str字符串写入stream文件中

参数:

str:字符串

stream:文件指针

返回:

成功:0

失败:-1

例:

#include

#include

int main() {

FILE *fp = NULL;

fp = fopen("./hello.txt","w");

if (fp == NULL)

{

perror("fopen");

exit(1);

}

// 操作文件

char *buf[] = {"大漠孤烟直\n","长河落日园"};

for (size_t i = 0; i < sizeof(buf)/sizeof(buf[0]); ++i) {

fputs(buf[i],fp);

}

fclose(fp);

return 0;

}

# hello.txt

大漠孤烟直

长河落日园

fgets获取一行

#include

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

功能:从stream文件中读取字符,写入str中,

直到出现换行符、文件结尾或已经读了size-1个字符为止,

最后会自动加上'\0'

参数:

str:字符串

size:最大读取字符串的长度

stream:文件指针

返回:

成功:字符串

读到文件尾或出错:NULL

例:四则运算解题神器

题目:

代码:

#include

#include

int main() {

FILE *fp = fopen("题目.txt","r");

if (fp == NULL)

{

perror("fopen");

exit(1);

}

char buf[128] = "";

while (fgets(buf,sizeof(buf),fp))

{

int num1 = 0, num2 = 0;

char ch = 0;

// 解包

sscanf(buf, "%d%c%d=", &num1, &ch, &num2);

// 计算

int sum = 0;

switch (ch)

{

case '+':

sum = num1 + num2;

break;

case '-':

sum = num1 - num2;

break;

case '*':

sum = num1 * num2;

case '/':

sum = num1 / num2;

break;

}

printf("%d%c%d = %d\n",num1,ch,num2,sum);

}

if (fp != NULL)

{

fclose(fp);

fp = NULL;

}

return 0;

}

1+1 = 2

102+3424 = 3526

483989-334224 = 149765

2304*381 = 6

3424*31555 = 0

333333321/34243 = 9734

32543625/55423 = 587

文件高级操作

文件重命名和删除

文件的块读写

将内存中的数据原样输出在文件

fwrite

#include

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

功能:把 ptr 所指向的数组中的数据写入到stream 中

参数:

ptr:指向要被写入的元素数组的指针。

size:要被写入的每个元素的大小,以字节为单位。

nmemb:元素的个数,每个元素的大小为 size 字节

stream:文件指针

返回:

如果成功,该函数返回一个 size_t 对象,

表示元素的总数,该对象是一个整型数据类型。

如果该数字与 nmemb 参数不同,则会显示一个错误

#include

#include

typedef struct {

char name[16];

int age;

float score;

}stu;

int main() {

stu student[3] = {

{"小李",13,100},

{"小红",14,119},

{"小明",15,120}

};

FILE *fp = fopen("./student.txt","w");

if (fp == NULL)

{

perror("fopen");

exit(1);

}

fwrite(student,sizeof(stu),3,fp);

fclose(fp);

return 0;

}

fread

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

功能:从给定流 stream 读取数据到 ptr 所指向的数组中

参数:

ptr:指向带有最小尺寸 size*nmemb 字节的内存块的指针

size:要读取的每个元素的大小,以字节为单位

nmemb:元素的个数,每个元素的大小为 size 字节

stream:文件指针

返回:

成功读取的元素总数会以 size_t 对象返回,

size_t 对象是一个整型数据类型。

如果总数与 nmemb 参数不同,

则可能发生了一个错误或者到达了文件末尾

#include

#include

typedef struct {

char name[16];

int age;

float score;

}stu;

int main() {

stu student[3];

FILE *fp = fopen("./student.txt","r");

if (fp == NULL)

{

perror("fopen");

exit(1);

}

int n = fread(student,sizeof(stu),3,fp);

for (size_t i = 0; i < n; ++i)

{

printf("name = %s, age = %d, score = %.2f\n",student[i].name,student[i].age,student[i].score);

}

fclose(fp);

return 0;

}

name = 小李, age = 13, score = 100.00

name = 小红, age = 14, score = 119.00

name = 小明, age = 15, score = 120.00

格式化读写

fprintf

fscanf

复位流指针

设置文件流指针

成功:0;失败:-1

ftell返回文件流指针距离文件首部的偏移量(字节)

获取文件状态

缓冲区

标签:fp,文件,stream,int,笔记,C语言,include,size

来源: https://www.cnblogs.com/zhujiangyu/p/13765369.html

将文件指针复位C语言,C语言学习笔记之 文件操作相关推荐

  1. 《Go语言圣经》学习笔记 第六章 方法

    <Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...

  2. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  3. 《Go语言圣经》学习笔记 第四章 复合数据类型

    <Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...

  4. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  5. 《Go语言圣经》学习笔记 第七章 接口

    <Go语言圣经>学习笔记 第七章 接口 目录 接口是合约 接口类型 实现接口的条件 flag.Value接口 接口值 sort.Interface接口 http.Handle接口 erro ...

  6. C语言基础入门学习笔记

    前言 我是一个初中生,过完暑假就是一个高一的学生了.在这个暑假里,我学习了韦东山老师和唐佐林老师的课程,所以我写下这个笔记来记录自己的成长历程. C语言基础入门学习笔记 格式 #include < ...

  7. 数据结构(C语言版)学习笔记2-单链表

    数据结构(C语言版)学习笔记2-单链表 1.单链表定义 typedef int ElemTypes; typedef struct node {ElemTypes data; //数据域struct ...

  8. 语言 提取列名_学习健明老师发布的R语言练习题的学习笔记(二)

    学习者:骆栢维 题目来源:生信基石之R语言 中级10 个题目:http://www.bio-info-trainee.com/3750.html 备注:本文为笔者学习健明老师GitHub答案代码的学习 ...

  9. 《Go语言圣经》学习笔记 第十一章 测试

    <Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...

最新文章

  1. html中运行php脚本,php脚本在html文件中
  2. python3.6.5安装教程-Centos7 安装Python3.6.
  3. CMake入门指南-编译教程
  4. Java8新特性 Optional类
  5. 吴杭民:上海的生活成本高过纽约(贪污腐败横行)
  6. python 判断div 之间的内容是否为空_python实现单向链表数据结构及其基本方法
  7. Playground
  8. Exynos4412 内核移植(七)—— 内核相关知识补充
  9. python实现批量图片/文件重命名
  10. 极光:2021年移动互联网母婴亲子行业研究报告
  11. JS String 对象 常用方法
  12. .net Core 学习笔记(实体字段映射,IOC注入)
  13. JS Navigator onLine 获取系统是否处于脱机模式
  14. 第12章 决策树 学习笔记下 决策树的学习曲线 模型复杂度曲线
  15. web服务器和app服务器
  16. NAS自回血方案介绍
  17. Useing rvm
  18. 热点综述 | 单细胞+空间转录组的整合分析方法总结
  19. 三极管(如NPN)集电极正偏 发射极反偏会怎么样呢? 电流会倒流吗? 其他三种都知道,就是不知道这种情况
  20. “聪明程序员”的自嘲

热门文章

  1. Rime输入工具的修改与编译安装
  2. IDEA插件系列(49):PowerMouse插件——鼠标手势
  3. 支付宝正式发布黑莓版客户端
  4. 免费正版杀毒软件集合 有你需要的
  5. 浏览器 pad android,腾讯发布 QQ浏览器 HD for Android Pad,加速布局手机浏览器
  6. Python构建企业微信智能应答机器人(含服务器部署)
  7. c++多线程调用python脚本
  8. Java第四十八天,Jsp之Taglib,自定义标签详解
  9. 禁止ftp用户ssh登录,允许ftp登录
  10. K8S系列(六)DaemonSet详解