Linux 第二十三章

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

回顾文件

fopen()

fwrite 

 fputs

>文件名

追加重定向 

 认识系统接口

open

linux中常见的函数传参数

umask

write

read

语言和系统的区别

文件描述符


回顾文件

文件=内容+属性

1.所有对文件的操作:

1)对内容操作

2)对属性操作

2.内容是数据,属性也是数据

3.我们要访问一个文件的时候,都是先把这个文件先打开

我们:进程(我们在访问文件,其实都是进程要访问这个文件)

打开前:这个文件是普通的磁盘文件

打开后:文件加载到内存

4.一个进程可以打开多个文件吗?多个进程可以打开多个文件吗?

加载到内存中,被打开的文件,可能会存在多个

文件加载内存中是由操作系统来做的

操作系统在运行中,可能会打开很多个文件

操作系统要不要管理打开的文件呢???如何管理呢??

先描述,在组织

一个文件要被打开,一定先在内核中形成被打开的文件对象

5.文件按照是否被打开,分为:被打开的文件(内存中),没有被打开的文件(磁盘中)

6.研究本次文件操作的本质:进程和打开文件的关系

fopen()

fopen是C语言标准库中的一个函数,用于打开一个文件,并返回一个指向该文件的指针。其原型如下:

FILE *fopen(const char *filename, const char *mode);
其中,filename表示要打开的文件名,可以包含路径信息,mode则表示打开文件的模式,包括读、写等操作,具体的取值包括:

* "r":以只读方式打开文件,如果文件不存在则返回NULL;
* "w":以写方式打开文件,如果文件不存在则创建,如果文件存在则清空文件内容;
* "a":以追加方式打开文件,如果文件不存在则创建;
* "r+":以读写方式打开文件,如果文件不存在则返回NULL;
* "w+":以读写方式打开文件,如果文件不存在则创建,如果文件存在则清空文件内容;
* "a+":以追加方式打开文件,如果文件不存在则创建;

示例代码:

#include <stdio.h>


int main() {
    FILE *fp = fopen("test.txt", "w");
    if(fp == NULL) {
        printf("Failed to open file.\n");
        return -1;
    }
    fprintf(fp, "Hello, world!\n");
    fclose(fp);
    return 0;
}

以上代码将会创建一个名为"test.txt"的文件,并向其中写入一行字符串"Hello, world!",然后关闭文件。

fwrite 

fwrite是C语言标准库中的一个函数,用于向文件中写入数据。

其原型如下:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
其中,ptr表示要写入的数据指针,size表示每个数据元素的大小(单位为字节),
count表示要写入的数据元素的个数,stream表示要写入的文件流指针。

函数返回值为成功写入的数据元素个数。

示例代码:

#include <stdio.h>
int main() {
    int arr[3] = {1, 2, 3};
    FILE *fp = fopen("test.bin", "wb");
    if(fp == NULL) 
    {
        printf("Failed to open file.\n");
        return -1;
    }
    fwrite(arr, sizeof(int), 3, fp);
    fclose(fp);
    return 0;
}

以上代码将会创建一个名为"test.bin"的二进制文件,并向其中写入一个包含三个整数的数组。通过fwrite函数,将整数数组arr的内容写入到文件中。注意,使用二进制模式打开文件时应该使用"wb"模式。

对于写入文本文件,我们可以使用fputs或fprintf函数。例如:

#include <stdio.h>
int main() {
    FILE *fp = fopen("test.txt", "w");
    if(fp == NULL) 
    {
        printf("Failed to open file.\n");
        return -1;
    }
    fputs("Hello, world!\n", fp);
    fprintf(fp, "%d %s\n", 123, "abc");
    fclose(fp);
    return 0;
}

以上代码将会创建一个名为"test.txt"的文本文件,并向其中写入两行字符串。第一行是"Hello, world!\n",第二行是"123 abc\n"。注意,在文本模式下打开文件时应该使用"w"模式。

 fputs

fputs是C语言标准库中的一个函数,用于向文件中写入字符串。

其原型如下:

int fputs(const char *str, FILE *stream);
其中,str表示要写入的字符串,stream表示要写入的文件流指针。
函数返回值为成功写入的字符个数(不包括字符串结尾的空字符'\0')。

示例代码:

#include <stdio.h>


int main() {
    FILE *fp = fopen("test.txt", "w");
    if(fp == NULL) {
        printf("Failed to open file.\n");
        return -1;
    }
    fputs("Hello, world!\n", fp);
    fclose(fp);
    return 0;
}

以上代码将会创建一个名为"test.txt"的文本文件,并向其中写入一行字符串"Hello, world!\n"。注意,在文本模式下打开文件时应该使用"w"模式。

>文件名

 >文件名,1.如果文件不存在,就会创建文件 2.如果文件存在则会清空文件

[BCH@hcss-ecs-6176 testfile]$ >log.txt//>重定向log.txt文件时,需要打开文件,
但是也没有做什么,所以就会关闭文件,此时文件就会被清空,和"w"打开文件一样
[BCH@hcss-ecs-6176 testfile]$ ll
总用量 20
-rw-rw-r-- 1 BCH BCH    0 11月 23 23:16 log.txt
-rw-rw-r-- 1 BCH BCH   65 11月 23 22:51 Makefile
-rwxrwxr-x 1 BCH BCH 8512 11月 23 23:12 myfile
-rw-rw-r-- 1 BCH BCH  414 11月 23 23:15 myfile.c

追加重定向 

[BCH@hcss-ecs-6176 testfile]$ ll
总用量 24
-rw-rw-r-- 1 BCH BCH   63 11月 23 23:24 log.txt
-rw-rw-r-- 1 BCH BCH   65 11月 23 22:51 Makefile
-rwxrwxr-x 1 BCH BCH 8512 11月 23 23:20 myfile
-rw-rw-r-- 1 BCH BCH  502 11月 23 23:23 myfile.c
[BCH@hcss-ecs-6176 testfile]$ echo "hello linux" >>log.txt//>>和”a"打开文件一样
[BCH@hcss-ecs-6176 testfile]$ ll
总用量 24
-rw-rw-r-- 1 BCH BCH   75 11月 23 23:24 log.txt
-rw-rw-r-- 1 BCH BCH   65 11月 23 22:51 Makefile
-rwxrwxr-x 1 BCH BCH 8512 11月 23 23:20 myfile
-rw-rw-r-- 1 BCH BCH  502 11月 23 23:23 myfile.c

 认识系统接口

open

open是Linux系统中的一个系统调用,用于打开文件或创建文件。
其原型如下:

#include <fcntl.h>//头文件
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
其中,pathname表示要打开或创建的文件路径名,flags表示打开或创建文件的方式和权限,mode表示创建文件时的权限。
flags参数可以使用以下常量进行组合:
* O_RDONLY:只读打开;
* O_WRONLY:只写打开;
* O_RDWR:读写打开;
* O_CREAT:如果文件不存在则创建;
* O_TRUNC:打开文件时截断文件长度为0;
* O_APPEND:在文件末尾追加数据;
* O_EXCL:与O_CREAT一起使用,如果文件已经存在则报错。
mode参数可以使用以下常量进行组合:
* S_IRWXU:用户具有读、写、执行权限;
* S_IRUSR:用户具有读权限;
* S_IWUSR:用户具有写权限;
* S_IXUSR:用户具有执行权限;
* S_IRWXG:组具有读、写、执行权限;
* S_IRGRP:组具有读权限;
* S_IWGRP:组具有写权限;
* S_IXGRP:组具有执行权限;
* S_IRWXO:其他用户具有读、写、执行权限;
* S_IROTH:其他用户具有读权限;
* S_IWOTH:其他用户具有写权限;
* S_IXOTH:其他用户具有执行权限。

示例代码:

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() 
{
    int fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
    if(fd == -1) 
    {
        printf("Failed to open file.\n");
        return -1;
    }
    write(fd, "Hello, world!\n", 14);
    close(fd);
    return 0;
}


以上代码将会创建一个名为"test.txt"的文件,并向其中写入一行字符串"Hello, world!\n",然后关闭文件。注意,在Linux系统中,文件的读写需要使用文件描述符来进行操作,因此需要先通过open函数打开文件,并返回一个文件描述符,然后使用write或read等函数进行读写操作,最后通过close函数关闭文件。

linux中常见的函数传参数

#include<stdio.h>

#define PRINT1 1 //0001//1
#define PRINT2 (1<<1) //0010//2
#define PRINT3 (1<<2) //0100//4
#define PRINT4 (1<<3) //1000//8

void print(int flags)
{
    if(flags&PRINT1)printf("print : 1\n");
    if(flags&PRINT2)printf("print : 2\n");
    if(flags&PRINT3)printf("print : 3\n");
    if(flags&PRINT4)printf("print : 4\n");
}
int main()
{
    print(PRINT1);
    print(PRINT1|PRINT2);
    print(PRINT1|PRINT2|PRINT3);
    print(PRINT1|PRINT2|PRINT3|PRINT4);
    return 0;
}

umask

在Linux中,umask也是一个系统调用,用于设置当前进程的文件创建屏蔽字(file creation mask)。它可以通过umask()函数来调用。

#include <sys/stat.h>
#include <sys/types.h>
mode_t umask(mode_t mask);
umask函数接受一个八进制数作为参数,表示要屏蔽的权限位。它返回先前的屏蔽字值。

以下是一个示例代码,展示了如何使用umask系统调用:

#include <stdio.h>
#include <sys/stat.h>
int main() {
    mode_t old_mask = umask(022);  // 设置屏蔽字为022
    printf("Old umask: %o\n", old_mask);

    // 创建文件
    FILE *file = fopen("test.txt", "w");
    if (file == NULL) {
        perror("Failed to create file");
        return -1;
    }
    fclose(file);

    return 0;
}

在上述示例中,首先使用umask(022)将屏蔽字设置为022,然后创建一个名为"test.txt"的文件。由于屏蔽字的设置,该文件的权限将是644(666 & ~022 = 644)。

需要注意的是,umask调用仅对当前进程及其子进程有效,不会永久更改系统的默认umask值。如果希望永久更改umask值,可以将其添加到shell的配置文件中,例如~/.bashrc或/etc/profile。
 

write

在Linux中,write是一个系统调用,用于将数据写入文件描述符(file descriptor)所指向的文件中。

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
* fd:文件描述符,表示要写入的文件。
* buf:指向要写入的数据的缓冲区。
* count:要写入的字节数。
write函数返回实际写入的字节数,如果出现错误则返回-1。

以下是一个示例代码,展示了如何使用write系统调用:

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int main() {
    int fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) 
    {
        perror("Failed to open file");
        return -1;
    }
    const char *data = "Hello, world!";
    ssize_t bytes_written = write(fd, data, strlen(data));
    if (bytes_written == -1) 
    {
        perror("Failed to write to file");
        close(fd);
        return -1;
    }

    printf("Bytes written: %zd\n", bytes_written);
    close(fd);

    return 0;
}


在上述示例中,首先使用open函数打开或创建一个名为"test.txt"的文件,并获得对应的文件描述符。然后使用write函数将字符串"Hello, world!"写入文件中。最后,关闭文件。

需要注意的是,文件需要以适当的方式打开(例如O_WRONLY表示只写),并且需要在使用write函数之前打开文件。并且,在写入数据时,需要确保缓冲区中的数据不会超过指定的字节数。
 

当我们想想向一个文件中写入字符串的时候,我们不需要在strlen()+1,\0是c语言的规定,不是文件的规定

read

在 Linux 中,read 系统调用用于从文件描述符读取数据。

它的原型如下:

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd 是要读取的文件描述符,可以是文件、套接字、管道等。
buf 是用来存储读取数据的缓冲区的指针。
count 是要读取的字节数。
read 函数返回值为读取的字节数。如果返回 -1,则表示读取出错;如果返回 0,则表示已到达文件末尾(或者读取的字节数为 0)。

以下是一个简单的示例,演示如何使用 read 系统调用从文件中读取数据:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
    char buffer[1024];
    ssize_t bytes_read;
    
    // 打开文件
    int fd = open("example.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    
    // 从文件中读取数据
    bytes_read = read(fd, buffer, sizeof(buffer));
    if (bytes_read == -1) {
        perror("read");
        exit(EXIT_FAILURE);
    }
    
    // 输出读取的数据
    printf("Read %zd bytes: %s\n", bytes_read, buffer);
    
    // 关闭文件
    close(fd);
    
    return 0;
}


在这个示例中,程序打开名为 "example.txt" 的文件,并使用 read 函数从文件中读取数据到 buffer 中。然后输出读取的数据,并关闭文件。

语言和系统的区别

c语言函数接口

FILE* fp=fopen("log.txt","w");
FILE* fp=fopen("log.txt","a");

系统调用接口

int fd=open("log.txt",O_WRONLY|O_CREAT|O_TRUNC);
int fd=open("log.txt",O_WRONLY|O_CREAT|O_APPEND);

文件描述符fd是一个连续的小整数理解文件,在操作系统中的表现:

fd的本质其实就是数组的下标
进程在运行的时候,默认是把
标准输入 键盘        stdin      0
标准输出 显示器    stdout    1
标准错误 显示器    stdout    2

操作系统访问文件,只认文件描述符


FILE是一个C语言提供的结构体类型,这个结构体必定封装了文件描述符

int main()
{
    printf("stdin:%d\n",stdin->_file);
    printf("stdin:%d\n",stdout->_file);
    printf("stdin:%d\n",stderr->_file);
    
    FILE* fp=fopen("log.txt","w");
    printf("fp:%d\n",fp->_file);
    fclose(fp);
}

结果:
stdin:0
stdin:1
stdin:2
fp:3

1.OS/C语言为什么默认要把0,1,2,stdin、stdout、strerr打开呢??就是为了让程序员默认进行输入输出代码编写

2.stderr是什么?

3.如何理解一切皆文件呢?

文件描述符

在Linux中,文件描述符fd(file descriptor)是一个非负整数,用于唯一标识打开的文件或其他输入/输出资源。文件描述符是操作系统内部维护的,应用程序通过文件描述符来访问文件、套接字、管道等。

下面是一些关于文件描述符的常见概念和用法:

1. 标准文件描述符:
    * 0:标准输入(STDIN_FILENO),通常关联到键盘输入。
    * 1:标准输出(STDOUT_FILENO),通常关联到屏幕输出。
    * 2:标准错误(STDERR_FILENO),通常关联到屏幕输出。
2. 打开文件:
    * 当你使用open函数打开一个文件时,它会返回一个文件描述符。
    * 文件描述符从3开始递增,每次成功打开一个文件就会分配一个新的文件描述符。
3. 文件描述符的读写:
    * 使用read函数从文件描述符中读取数据。
    * 使用write函数将数据写入文件描述符。
4. 关闭文件:
    * 使用close函数关闭文件描述符。
    * 关闭文件描述符后,它可以被重用。
5. 其他操作:
    * 可以使用dup或dup2函数复制文件描述符。
    * 使用fcntl函数进行更高级的文件描述符操作,如非阻塞模式、文件状态标志等。

下面是一个简单的示例,演示了打开文件、读取内容并关闭文件的过程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main() {
    int file_desc = open("example.txt", O_RDONLY);
    if (file_desc == -1) {
        perror("Error opening file");
        exit(1);
    }

    char buffer[100];
    ssize_t bytes_read = read(file_desc, buffer, sizeof(buffer));
    if (bytes_read == -1) {
        perror("Error reading file");
        exit(1);
    }
    printf("Read %zd bytes: %s\n", bytes_read, buffer);
    close(file_desc);
    return 0;
}


在这个例子中,我们使用open函数打开一个名为"example.txt"的文件,并通过read函数读取文件内容到缓冲区中。最后,使用close函数关闭文件描述符。
 

  🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AR人脸道具SDK解决方案,实现道具与人脸的自然融合

AR人脸道具SDK解决方案&#xff0c;实现道具与人脸的自然融合美摄科技以其卓越的技术实力和创新能力&#xff0c;为企业带来了全新的AR人脸道具SDK解决方案。这一解决方案将为企业打开全新的市场机会&#xff0c;为用户带来前所未有的互动体验。 颠覆传统&#xff0c;开启AR人…

如何使用cPanel的Transfers功能迁移cPanel账户

近期由于我们的原虚拟主机提供商不再支持低版本的PHP&#xff0c;我们准备将所有的cPanel账户都迁移到在Hostease购买的独立服务器中&#xff0c;新购买的独立服务器配置了cPanel&#xff0c;下面我就介绍如何使用cPanel的Transfers功能&#xff0c;将旧服务器的cPanel账户迁移…

5月的现货黄金价格还会涨吗

近期美国经济陷入滞胀的预期升温&#xff0c;市场对美联储年内降息的预期有所走低&#xff0c;然而目前美国10年期国债的实际收益率已处于2%左右的历史高位&#xff0c;降息空间最终还是打开&#xff0c;带来实际利率的趋势下行——在去全球化的背景下&#xff0c;美元信用持续…

Tuxera NTFS for Mac Mac用户无缝地读写NTFS格式的硬盘和U盘

在数字化时代&#xff0c;数据交换和共享变得日益重要。然而&#xff0c;对于Mac用户来说&#xff0c;与Windows系统之间的文件交换可能会遇到一些挑战。这是因为Mac OS默认不支持Windows常用的NTFS文件系统。幸运的是&#xff0c;Tuxera NTFS for Mac为我们提供了一个优雅的解…

JAVA代码审计2个小tips

1、lib文件过多时&#xff0c;快速定位lib代码文件 如已知java-callgraph找出的类名 但不知道在哪个lib文件时可利用该工具快速获取到相关lib&#xff0c;适用于大量不知道lib文件的情况。 SearchClassInJar.jar 2、快速定位api路由思路 静态&#xff1a; springmvc框架 …

内容安全(AV)

防病毒网关&#xff08;AV&#xff09;简介 基于网络侧 识别 病毒文件&#xff0c;工作范围2~7层。这里的网关指的是内网和外网之间的一个关口&#xff0c;在此进行病毒的查杀。在深信服中就有一个EDR设备&#xff0c;该设备就是有两种部署&#xff0c;一个部署在网关&#xf…

[Kubernetes] KubeKey 部署 K8s v1.28.8

文章目录 1.K8s 部署方式2.操作系统基础配置3.安装部署 K8s4.验证 K8s 集群5.部署测试资源 1.K8s 部署方式 kubeadm: kubekey, sealos, kubespray二进制: kubeaszrancher 2.操作系统基础配置 主机名内网IP外网IPmaster192.168.66.2139.198.9.7node1192.168.66.3139.198.40.17…

【竞技宝】英超:曼联4球惨败水晶宫,滕哈赫下课倒计时

曼联在本轮客场挑战水晶宫,这场比赛对于红魔来说就是不折不扣的复仇之战。因为,曼联曾经主场输给过水晶宫。所以,曼联再次遇到水晶宫,自然是憋着一口气要复仇。只是,曼联重压之下彻底迷失,被水晶宫4比0击溃。或许赛前有部分红魔球迷,会预料到曼联可能会输球,但是他们绝对不会想…

【Golang】VSCode进行GO的调试

原来的launch.json {"version": "0.2.0","configurations": [{"name": "Golang","type": "go","request": "launch","program": "${workspaceFolder}","…

[QNX] BSP 网络性能优化:调优io-pkt和ClockPeriod提升网速

0 概要 本文介绍如何在QNX系统上优化网络性能&#xff0c;主要通过调整io-pkt和ClockPeriod参数来实现。通过优化&#xff0c;网络吞吐量可以得到显著提升。 1 优化方法 1.1 调整io-pkt的mclbytes参数: io-pkt是QNX系统中常用的网络协议栈&#xff0c;其mclbytes参数指定了…

LearnOpenGL(八)之光照

一、冯氏光照模型 冯氏光照模型(Phong Lighting Model)主要由环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照这三部分组成&#xff0c;各效果如下&#xff1a; 1、环境光照 即使在黑暗的情况下&#xff0c;世界上通常也仍然有一些光亮&#xff08;月亮、远处的光&#…

只允许内网访问时,如何设置hosts

1、Hosts文件简介 hosts文件是一个没有扩展名的计算机文件&#xff0c;用于将主机名与对应的 IP 地址关联起来。在操作系统中&#xff0c;hosts文件通常用于在本地解析域名&#xff0c;以便将域名映射到特定的IP地址。这个文件可以用来屏蔽广告、加速访问特定网站、解决DNS解析…

微服务项目实战-黑马头条(十三):持续集成

文章目录 项目部署_持续集成1 今日内容介绍1.1 什么是持续集成1.2 持续集成的好处1.3 今日内容 2 软件开发模式2.1 软件开发生命周期2.2 软件开发瀑布模型2.3 软件的敏捷开发 3 Jenkins安装配置3.1 Jenkins介绍3.2 Jenkins环境搭建3.2.1 Jenkins安装配置3.2.2 Jenkins插件安装3…

第十四届蓝桥杯大赛软件赛省赛(Python大学A组)

2023年蓝桥杯 省赛真题Python大学A组 试题A&#xff1a;特殊日期 试题B&#xff1a;分糖果 试题C&#xff1a;三国游戏 试题D&#xff1a;平均 试题E&#xff1a;翻转 试题F&#xff1a;子矩阵 试题G&#xff1a;阶乘的和 …

张大哥笔记:先挣小钱,再赚大钱

先挣小钱&#xff0c;再赚大钱&#xff01;挣小钱&#xff0c;无需向上社交&#xff01; 现在很流行向上社交&#xff0c;反正只要前面加上一个向上&#xff0c;就感觉很牛逼的样子&#xff0c;有必要吗&#xff1f;我认为是没有必要的。 人活着不是为了社交&#xff0c;而是找…

大模型日报|今日必读的 4 篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.清华、智谱AI 团队推出无限超分辨率模型 Inf-DiT 近年来&#xff0c;扩散模型在图像生成方面表现出了卓越的性能。然而&#xff0c;由于在生成超高分辨率图像&#xff08;如 40964096&#xff09;的过程中内存会二…

银河麒麟QT项目打包详细教程

银河麒麟QT项目打包详细教程 一、QT项目打包 下载linuxdeployqt&#xff0c;下载地址&#xff1a;https://github.com/probonopd/linuxdeployqt/releases 安装Linuxdeployqt 2.1 为了安装方便&#xff0c;将下载下来的文件名称改短些 mv linuxdeployqt-6-x86_64.AppImage lin…

数据分析从入门到精通 1.numpy剑客修炼

会在某一瞬间突然明白&#xff0c;有些牢笼是自己给自己的 —— 24.5.5 一、数据分析秘笈介绍 1.什么是数据分析 是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来&#xff0c;总结出所研究对象的内在规律。使得数据的价值最大化 案例&#xff1a; 分析用户的消…

webpack5基础和配置

初步体验webpack打包 webpack是一个静态资源打包工具。 它会以一个或多个文件作为打包的入口&#xff0c;将我们整个项目所有文件编译组合成一个或多个文件输出出去。 输出的文件就是编译好的文件&#xff0c;就可以在浏览器段运行了。 1.初始化最简单的一个目录文件&#xff…

以steamDB的好评排名为引 - 详解wilson评分算法

写在前面 中文互联网上缺少关于二项分布估计的知识&#xff0c;而对二项分布参数如何准确且合理的估计的技巧&#xff0c;实际上在商业数据分析领域用处极多。尤其是在互联网企业&#xff0c;算法排名的依据很大程度要依赖这个统计量。我试图抛砖引玉&#xff0c;以steamDB的评…