C语言——如何进行文件操作

大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流
本文由:残念ing原创CSDN首发,如需要转载请通知
个人主页:残念ing-CSDN博客,欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:残念ing 的C语言系列专栏——CSDN博客
 

 这是一篇关于文件操作的文章,前面的文章会比较多,但是不用担心,我已经为你们总结好了。还有关键例子来助力你理解。话不多说,我们现在开始!!!!(建议使用电脑观看哦)

目录

前言:为什么要使用文件?????

1.那什么是文件呢???

1.1 文件名

2. 什么是二进制文件和文本文件?

3. 文件的打开和关闭

3.1 流和标准流

3.1.1 流(中间商)

3.1.2 标准流

3.2 文件指针

3.3 文件的打开和关闭

4. 文件的顺序读写

4.1 顺序读写函数介绍

4.2 对比⼀组函数:

5. 文件的随机读写

5.1 fseek

5.2 ftell

5.3 rewind

6. 文件读取结束的判定

6.1 被错误使用的 feof

7. 文件缓冲区


前言:为什么要使用文件?????

假设没有文件,那么我们写的程序的数据是储存子啊电脑的内存上,如果程序退出,内存回收,数据就会丢失了,等再次运行程序,是看不到上次程序的数据的,如果将数据进行持久化的保存,我们就可以使用文件。

本次学习的是数据文件。在之前我们所以的处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上的文件。

1.那什么是文件呢???

其实磁盘上的文件就是文件。但是在程序设计中,我们一般的文件有两种:程序文件,数据文件(从文件功能的角度来分类的 )。

程序文件:程序文件包括源程序文件(后缀为 .c)目标文件(Windows环境后缀为 .obj)可执行程序(Windows环境后缀为 .exe)。

数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据点文件,或者输出内容的文件。

1.1 文件名

每一个文件都要有一个唯一的文件标识,以便用户识别和引用。

文件包含3部分:文件路径+文件名主干+文件后缀;、

例如:D:\code\test.txt

为了方便起见,文件标识常被称为文件名

2. 什么是二进制文件和文本文件?

根据数据的组织形式,数据文件被称为文本文件或者二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

有个疑问:一个数据在内存中是怎么存储的呢?

字符一律以ASCII码形式存储,数值型数据即可以用ASCII码形式存储,也可以使用二进制形式存储。

如:如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),而⼆进制形式输出,则在磁盘上只占4个字节。

测试代码:

#include<stdio.h>
int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中fclose(pf);pf = NULL;return 0;
}

 10000在二进制文件中

 

3. 文件的打开和关闭

3.1 流和标准流

3.1.1 流(中间商)

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。

一般情况下,我们要向流中写数据,或者从流中读取数据,都是要打开流,然后操作。

3.1.2 标准流

我们会发现我们从键盘输入数据,向屏幕上输出数据,并没有发现有流打开。

其实C语音程序在启动的时候,就默认打开了3个流:

stdin——标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。

stdout——标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。

stderr——标准错误流,大多数环境中输出到显示器界面。

这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作了。

stdin、stdout、stder三个流的类型是:FILE*。通常称为文件指针。

C语言中,就是通过FILE*的文件指针来维护流的各种操作的。

3.2 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(若文件的名字,文件状态乃至文件当前的位置等)。这些信息是保证在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE。

例如,VS编译环境提供的stdio.h头文件中有以下的文件类型声明:

struct _iobuf {char* _ptr;int _cnt;char* _base;int _flag;int _file;int _charbuf;int _bufsiz;char* _tmpfname;
};
typedef struct _iobuf FILE;

注意:不同的C编译器的FILE类型包括的内容不完全相同,但是大同小异。

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并且填充其中的信息,使用者不关心细节。

一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

FILE* pf;//⽂件指针变量

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是⼀个结构体变量)。通过该文件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的文件。

 

3.3 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭⽂件

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

ANSIC 规定使用 fopen 函数来打开文件,fclose 来关闭文件。

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );文件名                打开方式
//关闭⽂件
int fclose ( FILE * stream );

mode 表示文件的打开模式,下面都是文件的打开模式:

例如:

//   . 表示当前目录
//  .. 表示上一级路径
//FILE* p=fopen("./../data.txt", "w");./../--相对路径
//FILE* p=fopen("c:\\dast\\1\\data.txt","r");\\...\\\...\\绝对路径
int main()
{//打开文件,为了写FILE* p=fopen("data.txt", "w");//没有文件时新建一个,有文件并且里面有内容,会清空文件内容if (p == NULL){perror("fopen");return 1;}//写文件//关闭文件fclose(p);p = NULL;return 0;
}

4. 文件的顺序读写

4.1 顺序读写函数介绍

上⾯说的适用于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀般指适用于标准输出流和其他输出流(如⽂件输出流)

例如:

int main()
{//打开文件,为了写FILE* p = fopen("data.txt", "r");//写用w,读用rif (p == NULL){perror("fopen");return 1;}//写文件//fputc('a', p);//fputc('b', p);//fputc('c', p);//fputc('d', p);//for (int i = 0; i < 26; i++)//{//	fputc('a' + i, p);//	fputc('a' + i, stdout);//stdout--关联到屏幕的标准输出流//	fputc('\n', p);//}//读文件int ch = fgetc(p);printf("%c ", ch);ch = fgetc(p);printf("%c ", ch);ch = fgetc(p);printf("%c ", ch);//关闭文件fclose(p);p = NULL;return 0;
}

 fputs 举例:

//fputs---写一串字符串进去文件里
int main()
{FILE* p3 = fopen("data.txt", "w");if (p3 == NULL){perror("fopen");return 1;}//写入fputs("abcdef\n", p3);fputs("abcdef\n", p3);fclose(p3);p3 = NULL;return 0;
}

fgets 举例:

//fputs---写一串字符串进去文件里
int main()
{FILE* p3 = fopen("data.txt", "w");if (p3 == NULL){perror("fopen");return 1;}//读取char arr[20];fgets(arr, 10, p3);//char* fgets(char* str,int num,FILE*stream)---只会读num-1个字符,放在str中;//字符最后为\0;fclose(p3);p3 = NULL;return 0;
}

 fprintf 举例:

//fprintf---可变参数变量
struct str
{char name[20];int eage;float score;
};
int main()
{struct str s = { "zhangsan",100,100.0f };struct str t = { 0 };FILE* p = fopen("data3.txt", "w");if (p == NULL){perror("p");return 1;}//写文件fprintf(p, "%s %d %f", s.name, s.eage, s.score);fclose(p);p = NULL;return 0;
}

fscanf 举例:

struct str
{char name[20];int eage;float score;
};
int main()
{struct str s = { "zhangsan",100,100.0f };struct str t = { 0 };FILE* p = fopen("data3.txt", "r");if (p == NULL){perror("p");return 1;}//写读文件fscanf(p, "%s %d %f", t.name, &(t.eage), &(t.score));fprintf(stdout, "%s %d %f", t.name, t.eage, t.score);fclose(p);p = NULL;return 0;
}

fwrite 举例:

struct str
{char name[20];int eage;float score;
};
int main()
{struct str s = { "zhangsan",100,100.0f };struct str t = {0};FILE* p = fopen("data5.txt", "wb");if (p == NULL){perror("p");return 1;}//以二进制的方式写文件fwrite(&s,sizeof(s),1,p);fclose(p);p = NULL;return 0;
}

fread 举例: 

struct str
{char name[20];int eage;float score;
};
int main()
{struct str s = { "zhangsan",100,100.0f };struct str t = {0};FILE* p = fopen("data5.txt", "r");if (p == NULL){perror("p");return 1;}//以二进制的方式读文件fread(&t, sizeof(t), 1, p);printf( "%s %d %f", t.name, t.eage, t.score);fclose(p);p = NULL;return 0;
}

4.2 对比⼀组函数:

scanf/fscanf/sscanf

printf/fprintf/sprintf

scanf --针对标准输入(键盘)的格式化输入函数

printf--针对标准输出流(屏幕)的格式化输出函数

fscanf--针对所有输入流的格式化输入函数

fprintf--针对所有输出流的格式化输出函数

sscanf--从一个字符串中读取一个格式化的数据

sprintf--把一个格式化的数据转换成字符串

举例:

struct s
{char name[20];int age;float score;
};
int main()
{struct s a = { "zhangsan",10,100 };char arr[100];sprintf(arr,"%s %d %f", a.name, a.age, a.score);//把结构体中的数据存放在字符数组中printf("%s\n", arr);struct s b = { 0 };sscanf(arr, "%s %d %f", b.name, &(b.age), &(b.score));//把字符数组中的数据读取出来存到结构体b中printf("%s %d %f\n", b.name, b.age, b.score);return 0;
}

5. 文件的随机读写

5.1 fseek

根据文件指针的位置和偏移量来定文件指针(文件内容的光标 )。

int fseek ( FILE * stream, long int offset, int origin )

例子

//文件的随机读写
//fseek--根据文件内容的光标进行读写
//int fseek(FILE* stream,long int offset,int origin);
//origin有三种选择
//1. SEEK_SET--从起始位置开始
//2. SEEK_CUR--从当前光标位置开始
//3. SEEK_END--从最后一位开始
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读文件int ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);fseek(pf, -3, SEEK_CUR);ch = fgetc(pf);printf("%c\n", ch);return 0;
}

5.2 ftell

返回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

例子:

//ftell--放回的是文件指针相对于起始位置的偏移量int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读文件int ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);int n = ftell(pf);printf("%d\n", n);fseek(pf, -n, SEEK_CUR);ch = fgetc(pf);printf("%c\n", ch);return 0;
}

5.3 rewind

让文件指针的位置回到文件的起始位置

void rewind ( FILE * stream );

例子:

//rewind--让文件指针的位置回到文件的起始位置int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读文件int ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);rewind(pf);//让文件指针回到文件起始位置ch = fgetc(pf);printf("%c\n", ch);return 0;
}

6. 文件读取结束的判定

6.1 被错误使用的 feof

牢记:在文件读取过程中,不能用 feof函数的返回值直接来判断文件是否结束。

feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。

1. 文本文件读取是否结束,判断返回值是否为 EOF fgetc ),或者 NULL fgets

例如:
fgetc 判断是否为EOF

fgetc 判断返回值是否为 NULL

2.二进制文件的读取结束判断,判断返回值是否小于实践要读的个数。

例如:

fread 判断返回值是否小于实际读的个数。

文本文件:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{int c; // 注意:int,⾮char,要求处理EOFFILE* fp = fopen("test.txt", "r");if (!fp) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环{putchar(c);}//判断是什么原因结束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);
}

二进制文件:

//二进制的例子
#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{double a[SIZE] = { 1.,2.,3.,4.,5. };FILE* fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp = fopen("test.bin", "rb");size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组if (ret_code == SIZE) {puts("Array read successfully, contents: ");for (int n = 0; n < SIZE; ++n) printf("%f ", b[n]);putchar('\n');}else { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}

7. 文件缓冲区

ANSIC 标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。 

#include <stdio.h>
#include <windows.h>
//VS2019 WIN11环境测试
int main()
{FILE* pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)//注:fflush 在⾼版本的VS上不能使⽤了printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭⽂件的时候,也会刷新缓冲区pf = NULL;return 0;
}

结论:缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升编程效率的利器: 解析Google Guava库之集合篇RangeSet范围集合(五)

在编程中&#xff0c;我们经常需要处理各种范围集合&#xff0c;例如时间范围、数字范围等。传统的集合类库往往只能处理离散的元素集合&#xff0c;对于范围集合的处理则显得力不从心。为了解决这个问题&#xff0c;Google的Guava库提供了一种强大的数据结构——RangeSet&…

【Transformer 】 Hugging Face手册 (01/10)

一、说明 本文是Hugging Face的用户手册。加入 Hugging Face 社区&#xff0c;在模型、数据集和空间上进行协作&#xff0c;通过加速推理获得更快的示例。 二、变形金刚 适用于 PyTorch、TensorFlow 和 JAX 的先进机器学习。 Transformers 提供 API 和工具&#xff0c;可轻松下…

计算机网络-物理层传输介质(导向传输介质-双绞线 同轴电缆 光纤和非导向性传输介质-无线波 微波 红外线 激光)

文章目录 传输介质及分类导向传输介质-双绞线导向传输介质-同轴电缆导向传输介质-光纤非导向性传输介质小结 传输介质及分类 物理层规定电气特性&#xff1a;规定电气信号对应的数据 导向传输介质-双绞线 双绞线的主要作用是传输数据和语音信息。它通过将两根导线以特定的方…

C#,德兰诺依数(Dealnnoy Number)的算法与源代码

1 Dealnnoy Number 德兰诺依数&#xff0c;德兰诺伊数 德兰诺依数是以法国军官、业余数学家亨利德兰诺依&#xff08;Henry Dealnnoy&#xff09;的名字命名。 Henry Dealnnoy 在组合数学中&#xff0c;德兰诺依数描述了从(0,0)到(m,n)的格路问题中&#xff0c; 只允许按照(0…

vue3之echarts3D环柱饼图

vue3之echarts3D环柱饼图 效果&#xff1a; 版本 "echarts": "^5.4.1", "echarts-gl": "^2.0.9" 核心代码&#xff1a; <template><div class"content"><div ref"eCharts" class"chart&…

【uniapp·微信登录】

一、新建文件夹&#xff08;登录&#xff09; 在HBuilderX中开发微信小程序的步骤如下&#xff1a; 在HBuilderX中新建一个uniapp项目。 在HBuilderX中配置安装的微信开发者工具路径&#xff0c;可以通过点击 工具》设置》运行配置–小程序运行配置 进行配置。 在HBuilderX中修…

【MySQL】聚集函数注意事项

聚集函数注意事项 除了 COUNT(*) 不会忽略列值为 NULL 的行&#xff0c;其他的聚集函数都会忽略。 MAX() 也可以返回文本中的最大值&#xff0c;返回排序后的最后一行。 MIN() 也可以返回文本中的最小值&#xff0c;返回排序后的第一行。 使用标准的算术操作符&#xff08;加…

动网格-网格重构之弹性光顺局部重构法(四)

弹性光顺法的基本特点 弹性光顺法中&#xff0c;网格线类似于弹簧&#xff0c;两端节点(node)作弹性移动 弹性光顺法有如下特点。 (1)节点的数量和节点之间的连接关系均不变&#xff0c;即节点之间的连接属性不变。 (2)单独使用时&#xff0c;仅限于变形非常小的情况&#xff…

while 和 do-while

签名&#xff1a;但行好事&#xff0c;莫问前程。 文章目录 前言一、while1、基本语法2、执行过程3、示例 二、do-while1、基本语法2、执行过程3、小练习&#xff08;ATM存款取款机&#xff09; 总结 前言 记录一下while 和 do-while 的使用。 一、while 1、基本语法 ①初始…

【Java万花筒】Java引擎加速:GPU计算与并行处理库助力你的应用翱翔

加速未来&#xff1a;掌握GPU计算&#xff0c;助力Java应用飞跃 前言 随着计算需求的不断增加&#xff0c;GPU计算和并行处理技术成为提高应用程序性能的关键。在Java生态系统中&#xff0c;有许多强大的库和工具&#xff0c;可以帮助开发者充分利用GPU的并行计算能力&#x…

Navicat连接MySQL出现Host is not allowed to connect to this MySQL server 解决方法

翻译 &#xff1a;‘不允许主机连接到此MySQL服务器’ &#xff08;意思是本地账号连接可以登录&#xff0c;但是远程登陆不行&#xff09; 解决方案&#xff1a; 1、输入mysql账号密码&#xff0c;登录mysql mysql -uroot -p2、进入mysql库 use mysql; 3、修改root账号的host…

Java:SpringBoot整合Hashids,实现数据ID加密隐藏

引入依赖 <dependency><groupId>org.hashids</groupId><artifactId>hashids</artifactId><version>1.0.3</version> </dependency>步骤 1、自定义注解 Documented Retention(RetentionPolicy.RUNTIME) Target({ElementType…

OpenHarmony—ArkTS限制throw语句中表达式的类型

规则&#xff1a;arkts-limited-throw 级别&#xff1a;错误 ArkTS只支持抛出Error类或其派生类的实例。禁止抛出其他类型&#xff08;例如number或string&#xff09;的数据。 TypeScript throw 4; throw ; throw new Error();ArkTS throw new Error();限制省略函数返回类…

el-tree实现多选、反选、指定选择

最近项目中遇到实现设备多选的需求&#xff0c;虽然这个需求很常见&#xff0c;但功能需求的不同&#xff0c;实现过程也大相径庭&#xff0c;我们的需求时只提供子级选择&#xff0c;父级不做选择&#xff0c;只提供层级显示&#xff1b; el-tree是elementPlus的组件&#xf…

Codeforces Round 835 (Div. 4)

目录 A. Medium Number B. Atilla’s Favorite Problem C. Advantage D. Challenging Valleys E. Binary Inversions F. Quests G. SlavicG’s Favorite Problem A. Medium Number 中位数,排序之后处于中间位置的数 void solve() {n3;vector<int> a(n);for(auto&a…

漏油检测时间大幅缩短!漏油传感器的检测原理是什么?

在油类化工厂、输油管道、油库等工业生产场所&#xff0c;漏油情况时有发生&#xff0c;如果不能及时发现&#xff0c;往往产生非常严重的后果。因此&#xff0c;由漏油控制器和漏油检测绳组合而成的漏油传感器被广泛应用了起来&#xff0c;能够在发生漏油时及时发出告警&#…

AHK学习,诡异的早起,舒畅地打篮球——2024 第4周总结

活神仙 引言颓 周六周日理清当前老问题新问题 总结当前之前的老问题 学习的AHKAHK历程AHK作用和适合人群 我帮别人解决的AHK例子我自用的AKH功能结尾 引言 今天才写周总结 是因为这两天有点颓 颓在哪里呢&#xff1f; 请听我细细说来 水文 技术有 AHK的&#xff0c;不想看可以…

【React教程】(1) React简介、React核心概念、React初始化

目录 ReactReact 介绍React 特点React 的发展历史React 与 Vue 的对比技术层面开发团队社区Native APP 开发 相关资源链接 EcmaScript 6 补充React 核心概念组件化虚拟 DOM 起步初始化及安装依赖Hello World React React 介绍 React 是一个用于构建用户界面的渐进式 JavaScrip…

Java-12.Spring 中通过 ThreadPoolTaskExecutor 和 AsyncConfigurerSupport 配置默认异步线程池

Java-12a.Spring 中通过 TaskDecorator 配置默认异步线程池 前言 虽然在 SpringBoot 2.7.x 中已经有关于异步线程池的默认配置&#xff0c;但如果还是要自定义的需求&#xff0c;仍然值得学习了解一下。 例如&#xff1a;想要在多线程池中添加 traceId&#xff1b;使用 tran…

【DC-DC】AP5125 降压恒流驱动器 60W LED电源驱动方案PCB+BOM表

这是一款60WLED驱动方案,线路图如下 ​ 祥单表&#xff1a; 实物图&#xff1a; 产品描述 特点应用领域应用原理图AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定…