C语言之文件操作

目录

一、文件是什么

1.1 程序文件

1.2 数据文件 

1.3 文件名

二、文件的作用

三、二进制文件和文本文件

四、文件的打开和关闭

4.1 流和标准流

(1)流

(2)标准流

4.2 文件指针

4.3 文件的打开和关闭

(1)fopen函数

(2)fclose函数

(3)文件的打开模式

五、文件的顺序读写函数介绍

(1)fgetc函数

(2)fputc函数

(3)fgets函数

(4)fputs函数

(5)fscanf函数

(6)fprintf函数

(7)fread函数

(8)fwrite函数

六、文件的随机读写

6.1 fseek函数

6.2 ftell函数

6.3 rewind函数

七、文件的其他函数

7.1 feof函数

7.2 clearerr函数

7.3 rename函数


一、文件是什么

文件是以计算机硬盘为载体,以单个名称在计算机上存储的信息集合

在程序设计中,我们一般说的文件有两种:程序文件和数据文件        

1.1 程序文件

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

1.2 数据文件 

在本文中,我们主要讨论数据文件。

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

以前我们对数据的输入和输出都是以终端为对象的,也就是从终端的键盘输入数据,把运行的结果显示到显示器上。

但实际上我们有时候也会把信息输出到磁盘上,当需要的时候再从磁盘上读取数据到内存中使用,这里处理的就是磁盘上的数据文件。

1.3 文件名

一个文件要有一个唯一的文件标识,也被称为文件名,以便用户识别和引用。

文件名包含三部分:文件路径+文件名主干+文件后缀,例如:

C:\ code \ 2023 \ test.txt


二、文件的作用

如果没有文件,我们写的程序的数据只能存储在电脑的内存中,如果程序退出,内存被回收,数据就丢失了。如果要将数据进行持久化的保存,就需要使用文件。


三、二进制文件和文本文件

根据数据的转换形式,数据文件也被称为文本文件或者二进制文件

我们知道,数据在内存中是以二进制的形式存储的,如果对其不加转换的以二进制形式输出到文件,就是二进制文件。

如果将数据转换成ASCII码的形式存储到文件中,就是文本文件。

举个例子,如果将存储在内存中的整数10000以ASCII码的形式输出到磁盘,就是文本文件,此时磁盘中占用5个字节(每个字符的ASCII码值占一个字节);以二进制形式输出到磁盘,就是二进制文件,在磁盘上只占4个字节。如图:


四、文件的打开和关闭

4.1 流和标准流

(1)流

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

C语言针对文件、画面、键盘等的数据输入输出操作都要经过流。一般情况下,我们想读写数据,也要先打开流之后才能操作。

(2)标准流

但是,似乎我们平时从键盘输入数据,或者向屏幕上输出数据时并没有打开流,怎么个事呢?

这是因为C语言程序在启动的时候默认会打开3个流:

  • stdin:标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据
  • stdout:标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中
  • stderr:标准错误流,大多数环境中输出至显示器界面

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

这三个流的类型为 FILE* ,通常我们称为文件指针

4.2 文件指针

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

例如,在vs2013编译环境提供的<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语言编译器的FLIE类型包含的内容不完全相同,但大同小异。

下面我们可以尝试创建一个FILE*类型的指针变量

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

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

4.3 文件的打开和关闭

(1)fopen函数

编写程序的时候,我们在程序中读写文件之前应该先打开文件,在使用结束之后应该关闭文件。

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

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

fopen函数在使用后会返回一个FILE*类型的指针变量指向该文件,相当于建立了指针和文件的关系。其参数 filename 表示文件名,mode 表示文件的打开模式,这里会在后面讲

想了解更多关于fopen函数的内容请点击下方链接

fopen - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fopen/

(2)fclose函数

int fclose ( FILE * stream );

使用fclose函数后,如果文件关闭成功则返回0,如果失败则返回EOF。其参数 stream 应该为指向要关闭的文件的文件指针

想了解更多关于fclose函数的内容请点击下方链接

fclose - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fclose/?kw=fclose

(3)文件的打开模式

上面提到,mode表示文件的打开模式,以下都是文件的打开模式

文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾部添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾部添加数据建立一个新的文件
“r+”(读写)为读写,打开一个文本文件出错
“w+”(读写)为读写,建立一个新的文件建立一个新的文件
“a+”(读写)为读写打开一个文本文件,并在文件尾进行写入建立一个新的文件
“rb+”(读写)为读写打开一个二进制文件出错
“wb+”(读写)为读写新建一个二进制文件建立一个新的文件
“ab+”(读写)为读写打开一个二进制文件,并在文件尾进行写入建立一个新的文件

cplusplus网站中的实例代码:

/* fopen fclose example */
#include <stdio.h>
int main()
{FILE *pFile;// 打开⽂件pFile = fopen("myfile.txt", "w");// ⽂件操作if (pFile != NULL){fputs("fopen example", pFile);// 关闭⽂件fclose(pFile);}return 0;
}

我们这里可以试着用fopen打开一个不存在的指定文件(只读模式),看看效果


五、文件的顺序读写函数介绍

函数名功能适用于
fgetc
字符输入函数
所有输入流
fputc
字符输出函数
所有输出流
fgets
⽂本⾏输入函数
所有输入流
fputs
⽂本⾏输出函数
所有输出流
fscanf格式化输出函数所有输入流
fprintf
格式化输入函数
所有输出流
fread
⼆进制输入
文件输入流
fwrite
⼆进制输出
文件输出流

 上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。

(1)fgetc函数

int fgetc (FILE* stream);

  • stream:指向输入流的FILE对象的指针
  • 成功返回读取的个数,失败返回EOF
/* fgetc example: money counter */
#include <stdio.h>
int main()
{FILE *pFile;int c;int n = 0;pFile = fopen("myfile.txt", "r");if (pFile == NULL)perror("Error opening file");else{do{c = fgetc(pFile);if (c == '$')n++;} while (c != EOF);fclose(pFile);printf("The file contains %d dollar sign characters ($).\n", n);}return 0;
}

作用是从流中读取一个字符

想要了解更多关于fgetc函数的内容请点击下方链接

fgetc - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fgetc/?kw=fgetc

(2)fputc函数

int fputc ( int character, FILE* stream);

  • character:要写入的字符
  • stream: 指向输出流的FILE对象的指针
  • 成功则返回写入的字符,失败则返回EOF并设置错误标识符(ferror)
/* fputc example: alphabet writer */
#include <stdio.h>int main()
{FILE *pFile;char c;pFile = fopen("alphabet.txt", "w");if (pFile != NULL){for (c = 'A'; c <= 'Z'; c++)fputc(c, pFile);fclose(pFile);}return 0;
}

作用是从流中写入一个字符

想要了解更多关于fputc函数的内容请点击下方链接

fputc - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fputc/

(3)fgets函数

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

  • str:指向被复制字符串将要输入到的char数组的指针
  • num:要复制到str中的最大字符数
  • stream: 指向输入流的FILE对象的指针
/* fgets example */
#include <stdio.h>int main()
{FILE *pFile;char mystring[100];pFile = fopen("myfile.txt", "r");if (pFile == NULL)perror("Error opening file");else{if (fgets(mystring, 100, pFile) != NULL)puts(mystring);fclose(pFile);}return 0;
}

作用是从流中读取一个字符串

想要了解更多关于fgets函数的内容请点击下方链接

fgets - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fgets/?kw=fgets

(4)fputs函数

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

  • str:要写入的字符串
  • stream: 指向输出流的FILE对象的指针
/* fputs example */
#include <stdio.h>int main()
{FILE *pFile;char sentence[256];printf("Enter sentence to append: ");fgets(sentence, 256, stdin);pFile = fopen("mylog.txt", "a");fputs(sentence, pFile);fclose(pFile);return 0;
}

作用是从流中写入一个字符串

想要了解更多关于fputs函数的内容请点击下方链接

fputs - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fputs/?kw=fputs

(5)fscanf函数

int fscanf ( FILE* stream , const char* format , ... );

  • stream: 指向输入流的FILE对象的指针

实际上,fscanf就比scanf多了一个stream参数而已,作用是相似的

/* fscanf example */
#include <stdio.h>int main()
{char str[80];float f;FILE *pFile;pFile = fopen("myfile.txt", "w+");fprintf(pFile, "%f %s", 3.1416, "PI");rewind(pFile);fscanf(pFile, "%f", &f);fscanf(pFile, "%s", str);fclose(pFile);printf("I have read: %f and %s \n", f, str);return 0;
}

作用是格式化的读取数据

想要了解更多关于fscanf函数的内容请点击下方链接

fscanf - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf

(6)fprintf函数

int fprintf ( FILE* stream , const char* format , ... );

同上,也只是比printf多了一个stream参数 

/* fprintf example */
#include <stdio.h>int main()
{FILE *pFile;int n;char name[100];pFile = fopen("myfile.txt", "w");for (n = 0; n < 3; n++){puts("please, enter a name: ");gets(name);fprintf(pFile, "Name %d [%-10.10s]\n", n + 1, name);}fclose(pFile);return 0;
}

作用是写入格式化的数据

想要了解更多关于fprintf函数的内容请点击下方链接

fprintf - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fprintf/

(7)fread函数

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

  • 返回成功读取的元素个数
  • ptr:指向目标内存块的指针
  • size:要读取的每个元素的大小
  • count:元素的个数
  • stream:指向输入流的指针

想要了解更多关于fread函数的内容请点击下方链接

fread - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fread/?kw=fread

(8)fwrite函数

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

与上面同理,就不赘述了

想要了解更多关于fwrite函数的内容请点击下方链接

fwrite - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fwrite/


六、文件的随机读写

文件的随机读写并不是随机数那种随机,而是指可以从任意地方开始读写文件,这里就要引入几个函数了

6.1 fseek函数

 可以根据文件指针的位置和偏移量来定位文件指针

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

  •  stream:文件指针
  • offset:偏移量
  • origin:偏移量参考的位置,C语言中定义了几个常量用作此函数的参数:SEEK_SET为文件开头位置;SEEK_CUR为文件指针的当前位置;SEEK_END为文件结束位置
/* fseek example */
#include <stdio.h>int main()
{FILE *pFile;pFile = fopen("example.txt", "wb");fputs("This is an apple.", pFile);fseek(pFile, 9, SEEK_SET);fputs(" sam", pFile);fclose(pFile);return 0;
}

 想要了解更多关于fseek函数的内容请点击下方链接

fseek - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/fseek/?kw=fseek

6.2 ftell函数

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

long int ftell ( FILE* stream);

/* ftell example : getting size of a file */
#include <stdio.h>int main()
{FILE *pFile;long size;pFile = fopen("myfile.txt", "rb");if (pFile == NULL)perror("Error opening file");else{fseek(pFile, 0, SEEK_END); // non-portablesize = ftell(pFile);fclose(pFile);printf("Size of myfile.txt: %ld bytes.\n", size);}return 0;
}

想要了解更多关于ftell函数的内容请点击下方链接

ftell - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/ftell/?kw=ftell

6.3 rewind函数

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

void rewind ( FILE* stream);

/* rewind example */
#include <stdio.h>int main()
{int n;FILE *pFile;char buffer[27];pFile = fopen("myfile.txt", "w+");for (n = 'A'; n <= 'Z'; n++)fputc(n, pFile);rewind(pFile);fread(buffer, 1, 26, pFile);fclose(pFile);buffer[26] = '\0';puts(buffer);return 0;
}

想要了解更多关于rewind函数的内容请点击下方链接

rewind - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/rewind/?kw=rewind


七、文件的其他函数

7.1 feof函数

判断文件流是否读取到了文件尾

int feof( FILE *stream );

/* feof example: byte counter */
#include <stdio.h>int main()
{FILE *pFile;int n = 0;pFile = fopen("myfile.txt", "rb");if (pFile == NULL)perror("Error opening file");else{while (fgetc(pFile) != EOF){++n;}if (feof(pFile)){puts("End-of-File reached.");printf("Total number of bytes read: %d\n", n);}elseputs("End-of-File was not reached.");fclose(pFile);}return 0;
}

想要了解更多关于feof函数的内容请点击下方链接

feof - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/feof/?kw=feof

7.2 clearerr函数

清除文件错误标志

void clearerr( FILE *stream );

/* writing errors */
#include <stdio.h>
int main()
{FILE *pFile;pFile = fopen("myfile.txt", "r");if (pFile == NULL)perror("Error opening file");else{fputc('x', pFile);if (ferror(pFile)){printf("Error Writing to myfile.txt\n");clearerr(pFile);}fgetc(pFile);if (!ferror(pFile))printf("No errors reading myfile.txt\n");fclose(pFile);}return 0;
}

 想要了解更多关于clearerr函数的内容请点击下方链接

clearerr - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/clearerr/?kw=clearerr

7.3 rename函数

重命名文件

int rename ( const char * oldname, const char * newname );

/* rename example */
#include <stdio.h>int main()
{int result;char oldname[] = "oldname.txt";char newname[] = "newname.txt";result = rename(oldname, newname);if (result == 0)puts("File successfully renamed");elseperror("Error renaming file");return 0;
}

想要了解更多关于rename函数的内容请点击下方链接

rename - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdio/rename/?kw=rename

完. 

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

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

相关文章

LinuxC中进程通信

LinuxC中进程通信 信号&#xff08;Signals&#xff09;&#xff1a;Linux 提供了信号机制&#xff0c;允许一个进程向另一个进程发送信号以通知特定事件的发生。这是一种轻量级的通信机制&#xff0c;通常用于处理异步事件。您可以使用 kill 命令或 kill 函数来发送信号&…

CleanMyMac2024绿色免费激活码序列号

2024CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具&#xff0c;电脑刚装完系统的时候运行速度超级快&#xff0c;随着时间的推移&#xff0c;你会发现越来越慢&#xff0c;经常会反应卡顿&#xff0c;越来越多的垃圾文件占用了你的磁盘空间&#xff0c;各种过时的日志…

EM的理论基础

1 EM定义​ 电迁移(Electro-Migration)是指在外加电场下,电子和金属原子之间的动量转移导致材料的运动。这种动量传递导致金属原子(比如Cu原子)从其原始位置移位,如图7-1。这种效应随着导线中电流密度的增加而增加,并且在更高的温度下,动量传递变得更加严重。因此,在先…

浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

TikTok与虚拟现实的完美交融:全新娱乐时代的开启

TikTok&#xff0c;这个风靡全球的短视频平台&#xff0c;与虚拟现实&#xff08;VR&#xff09;技术的深度结合&#xff0c;为用户呈现了一场全新的娱乐盛宴。虚拟现实技术为TikTok带来了更丰富、更沉浸的用户体验&#xff0c;标志着全新娱乐时代的开启。本文将深入探讨TikTok…

多线程------ThreadLocal详解

目录 1. 什么是 ThreadLocal&#xff1f; 2. 如何使用 ThreadLocal&#xff1f; 3. ThreadLocal 的作用 4. ThreadLocal 的应用场景 5. ThreadLocal 的注意事项 我的其他博客 ThreadLocal 是 Java 中一个很有用的类&#xff0c;它提供了线程局部变量的支持。线程局部变量…

docker的资源控制

对容器使用宿主机的资源进行限制。例如&#xff1a;cpu、内容、磁盘I/O docker使用Linux自带的功能Cgroup功能进行控制 Cgroup是什么&#xff1f; Cgroup&#xff1a;Control grouos是Linux内核系统提供的一种可以限制、记录、隔离进程组所使用的物理资源机制。 docker借助…

鸿蒙(HarmonyOS)北向开发项目编译问题汇总

运行Hello World Hello World 工程可以运行在模拟器中&#xff0c;或者运行在真机设备中。本示例先以选择将 Hello World 工程运行在模拟器中进行说明&#xff0c;如果选择运行在真机设备中&#xff0c;需要先对工程进行签名&#xff0c;然后才能运行在真机设备中。 DevEco S…

el-table自定义表格数据

如上所示&#xff1a; 表格内的数据是&#xff1a;当前班级所在名次段的人数 / 当前班级1至n名的累计人数 5/12 也就是 5/75 需要变更为&#xff1a; 截至到当前名次段总人数&#xff08;上次考试&#xff09; / 截至到当前名次段总人数&#xff08;本次考试&#xff09…

排序的简单理解(上)

1. 排序的概念及引用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作&#xff08;按照我们的需求能够有序的将数据信息排列起来&#xff09;。 稳定性&#xff1a;假…

工业级路由器在货运物流仓储管理中的应用

工业级路由器在货运物流仓储管理中扮演着重要的角色&#xff0c;为整个物流系统提供了稳定可靠的网络连接和数据传输支持。下面将从以下几个方面介绍工业级路由器在货运物流仓储管理中的应用。 实时监控和追踪&#xff1a;工业级路由器通过与各种传感器、监控设备和物联网设备的…

骨灰级程序员那些年曾经告诉我们的高效学习的态度

一、背景 以前阅读陈皓老师的左耳听风专栏中关于如何高效学习的总结让我收货颇丰&#xff0c;今天总结了一下&#xff0c;分享给大家 老师说&#xff1a; 学习是一件“逆人性”的事&#xff0c;就像锻炼身体一样&#xff0c;需要人持续付出&#xff0c;会让人感到痛苦&#…

Layui实现自定义的table列悬停事件并气泡提示信息

1、概要 使用layui组件实现table的指定列悬停时提示信息&#xff0c;因为layui组件中没有鼠标悬停事件支持&#xff0c;所以需要结合js原生事件来实现这个功能&#xff0c;并结合layui的tips和列的templte属性气泡提示实现效果。 2、效果图 3、代码案例 <!DOCTYPE html&g…

2023自动化测试框架的设计原则你都知道吗?快来看!

1.代码规范 测试框架随着业务推进&#xff0c;必然会涉及代码的二次开发&#xff0c;所以代码编写应符合通用规范&#xff0c;代码命名符合业界标准&#xff0c;并且代码层次清晰。特别在大型项目、多人协作型项目中&#xff0c;如果代码没有良好的规范&#xff0c;那么整个框架…

Linux进程控制

Linux进程控制 一.进程创建(fork函数)二.进程终止1.退出码的概念2.查看错误码3.查看错误码对应的错误信息1.strerror2.函数退出时的错误码2.自定义错误码 4.进程异常5.exit终止进程6.总结 三.进程等待1.为什么要有进程等待2.wait3.waitpid1.函数介绍2.演示3.利用位运算分别取出…

网工内推 | IT经理,50k*14薪,NP以上即可,七险一金

01 海天瑞声 招聘岗位&#xff1a;IT经理 职责描述&#xff1a; 1、IT基础架构的方案制定、实施和日常维护&#xff0c;包括机房建设运维、服务器配置及运维、网络规划及运维、上网行为管理、电话、电话、监控、门禁等各类弱电系统搭建及运维 2、负责公司环境及网络安全防御体…

【论文阅读】深度学习方法在数字岩石技术中的应用进展

【论文名称】Advances in the application of deep learning methods to digital rock technology 深度学习方法在数字岩石技术中的应用进展 【论文来源】EI检索 【作者单位】长江大学地球物理与油气资源学院、加拿大阿尔伯塔大学土木与环境工程系、东北石油大学地球科学学院、…

微信小程序:用map()将对象数组中的某一项组合成新数组

使用分析 使用map()方法来遍历 info 数组中的每个元素&#xff0c;并整合每一个对象中的某一项进行新数组的重组 效果展示 这里是查询对象数组中的全部name值 原始数据 提取出name的数组 核心代码 var infos items.map(item > item.name); 完整代码&#xff08;用微信小程…

Facebook广告投放常见错误

在进行Facebook广告投放时&#xff0c;很容易犯一些常见的错误。这些错误可能导致广告投资的浪费&#xff0c;影响广告效果并降低回报。本文小编讲一些常见的Facebook广告投放错误&#xff0c;以及如何避免它们。 1、不明确目标受众 广告的成功与否很大程度上取决于你选择的目…

JVM GUI可视化监控及诊断工具

工具既述 使用命令行工具或组合能帮您获取目标Java应用性能相关的基础信息&#xff0c;但它们存在下列局限&#xff1a; 无法获取方法级别的分析数据&#xff0c;如方法间的调用关系、各方法的调用次数和调用时间等&#xff08;这对定位应用性能瓶颈至关重要&#xff09;。要…