46 C 语言文件的打开与关闭、写入与读取函数:fopen、fclose、fputc、fputs、fprintf、fgetc、fgets、fscanf

news2024/12/23 5:50:22

目录

1 文件的存储形式

2 打开文件——fopen() 函数

2.1 功能描述

2.2 函数原型

2.3 文件打开方式(模式)

3 关闭文件——fclose() 函数

3.1 功能描述

3.2 函数原型

4 常见的文件写入方式

4.1 fputc() 函数

4.1.1 功能描述

4.1.2 函数原型

4.1.3 案例演示

4.2 fputs() 函数

4.2.1 功能说明

4.2.2 函数原型

4.2.3 案例演示

4.3 fprintf() 函数

4.3.1 功能说明

4.3.2 函数原型

4.3.3 案例演示

4.4 文件写入——综合案例演示

5 常见的文件写入方式

5.1 fgetc() 函数

5.1.1 功能说明

5.1.2 函数原型

5.1.3 案例演示

5.2 fgets() 函数

5.2.1 功能说明

5.2.2 函数原型

5.2.3 案例演示

5.3 fscanf 函数

5.2.1 功能说明

5.2.2 函数原型

5.2.3 案例演示


1 文件的存储形式

        文件,无论是文本文件还是二进制文件,都是以连续的字节序列形式存储在存储设备上的。这种存储方式确保了文件内容的完整性和可访问性,同时也为高效的文件管理和操作提供了基础。C 语言为此提供了一套全面且强大的函数库,使得开发者能够方便地进行文件的读取、写入、更新等操作。

  • 文本文件通常由人类可读的字符组成,每个字符占用一个字节(在 ASCII 编码中)或多个字节(在 Unicode 编码中)。文本文件通常用于存储源代码、配置信息、日志记录等。在不同的操作系统中,文本文件的换行符可能有所不同(例如,Windows 使用 \r\n,而 Unix/Linux 使用 \n)。
  • 二进制文件可以包含任何类型的字节序列,包括非打印字符。二进制文件通常用于存储图像、音频、视频等多媒体数据,以及编译后的程序代码。由于二进制文件的内容不是人类直接可读的,因此在读写时需要特别注意数据的格式和结构。

2 打开文件——fopen() 函数

2.1 功能描述

        fopen() 函数主要用于打开一个文件,或者创建一个新文件。它允许程序以读取、写入或追加的方式访问文件。如果指定的文件不存在,某些模式下 fopen() 可能会创建该文件。如果文件存在,某些模式可能会清除文件内容或在文件末尾追加内容。

2.2 函数原型

#include <stdio.h>
FILE *fopen(const char *filename, const char *mode);

参数:

  • filename:一个指向以 null 结尾的字符串的指针,该字符串包含了要打开的文件的路径(位置 + 名称),路径可以是绝对路径,也可以是相对路径
    • 绝对路径:从根目录开始的完整路径。在 Unix/Linux 系统中使用正斜杠 /,在 Windows 系统中可以使用反斜杠 \,但需要注意使用转义字符 \\,或者使用正斜杠 / 也是兼容的。
    • 相对路径:相对于当前工作目录的路径。
  • mode:一个指向以 null 结尾的字符串的指针,该字符串指定了打开文件的方式。详情见表2.3。

返回值:

  • 成功时返回一个指向 FILE 类型的指针,表示已打开的文件流
  • 失败时返回 NULL

2.3 文件打开方式(模式)

模式描述
r

只读模式

打开一个已存在的文本文件,只允许读取文件。如果文件不存在,则打开失败。

w

只写模式

打开一个文本文件,从头写入文件。如果文件不存在,则会创建一个新文件并写入;如果文件存在,则清空文件并从头写入。

a

追加模式

打开一个文本文件,追加写入文件。如果文件不存在,则会创建一个新文件并写入;如果文件存在,在已有内容后面追加写入。

rb

只读二进制模式

打开一个已存在的二进制文件,只允许读取文件。如果文件不存在,则打开失败。

wb

只写二进制模式

打开一个二进制文件,从头写入文件。如果文件不存在,则会创建一个新文件并写入;如果文件存在,则清空文件并从头写入。

ab

追加二进制模式

打开一个二进制文件,追加写入文件。如果文件不存在,则会创建一个新文件并写入;如果文件存在,在已有内容后面追加写入。

r+

读写模式

打开一个已存在的文本文件,允许读写文件。文件指针位于文件开头。如果文件不存在,则打开失败。

w+

读写模式

打开一个文本文件,从头读写文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,则清空文件并从头读写。

a+

读写模式

打开一个文本文件,读取或追加写入文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,文件指针位于文件末尾,读取时从开头开始,写入时在已有内容后面追加。

rb+

读写二进制模式

打开一个已存在的二进制文件,允许读写文件。文件指针位于文件开头。如果文件不存在,则打开失败。

r+b

读写二进制模式

同 rb+,允许读写二进制文件。

wb+

读写二进制模式

打开一个二进制文件,从头读写文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,则清空文件并从头读写。

w+b

读写二进制模式

同 wb+,允许读写二进制文件。

ab+

读写二进制模式

打开一个二进制文件,读取或追加写入文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,文件指针位于文件末尾,读取时从开头开始,写入时在已有内容后面追加。

a+b

读写二进制模式

同 ab+,允许读写二进制文件。

补充说明:

  • 文件指针位置:在某些模式下,文件指针的位置是固定的。例如,在 a 和 a+ 模式下,文件指针默认位于文件末尾,但在读取时可以从文件开头开始。
  • 文件创建:在 waw+a+wbabwb+ab+ 模式下,如果文件不存在,fopen() 会创建一个新文件
  • 文件清空:在 ww+wbwb+ 模式下,如果文件已经存在,fopen() 会清空文件内容
  • 文本与二进制模式:文本模式(rwar+w+a+)在某些系统上会对换行符进行转换,而二进制模式(rbwbabrb+wb+ab+)则不会进行任何转换。
  • 不会创建目录:无论使用哪种模式,fopen 函数都不会创建目录。fopen 只负责打开或创建文件,但不会创建文件路径中不存在的目录。如果指定的路径中的某个目录不存在,fopen 会失败并返回 NULL。
  • 读文件从文件中读取数据到内存中,对于内存来说是输入流
  • 写文件将内存中的数据写入到文件中,对于内存来说是输出流

3 关闭文件——fclose() 函数

3.1 功能描述

        fclose() 函数的主要功能是关闭一个文件流当文件流被关闭时,所有未写入磁盘的缓冲区数据会被刷新,文件指针和相关资源会被释放。关闭文件是一个重要的步骤,可以避免资源泄漏和数据丢失。

3.2 函数原型

#include <stdio.h>
int fclose(FILE *stream);

参数:

  • stream:一个指向 FILE 类型的指针,表示要关闭的文件流。这个指针通常是通过 fopen() 函数获得的。

返回值:

  • 如果文件成功关闭,返回 0
  • 如果关闭文件时发生错误,返回 EOF(通常定义为 -1)

4 常见的文件写入方式

4.1 fputc() 函数

4.1.1 功能描述

        fputc() 函数的主要功能是将一个字符写入指定的文件流中。如果写入成功,该函数返回写入的字符;如果写入失败,返回 EOF。

4.1.2 函数原型

#include <stdio.h>
int fputc(int c, FILE *stream);

参数:

  • c要写入的字符。虽然参数类型是 int,但实际上传递的是一个字符(char 类型),因为 EOF 也是一个 int 类型的特殊值。
  • stream:一个指向 FILE 类型的指针,表示要写入的文件流。这个指针通常是通过 fopen() 函数获得的。

返回值:

  • 如果字符成功写入文件,返回写入的字符(转换为 unsigned char 后再转换为 int)
  • 如果写入失败,返回 EOF(通常定义为 -1)

4.1.3 案例演示

#include <stdio.h>

int main()
{
    // 打开文件,使用追加模式('a')。如果文件不存在,则会创建一个新文件
    // 如果文件存在,则会在文件末尾追加内容
    // 如果指定的路径中的某个目录不存在,fopen 会失败,并返回 NULL
    FILE *file = fopen("./path/files/output1.txt", "a"); // 追加写入

    // 检查文件是否成功打开
    if (file != NULL)
    {
        // 定义要写入的字符
        char ch = 'A';

        // 使用 fputc 函数写入一个字符
        int result1 = fputc(ch, file);

        // 检查 fputc 是否成功
        if (result1 != EOF)
        {
            // 如果写入成功,输出成功信息及返回值
            printf("成功使用 fputc 写入字符 '%c',返回值:%d。\n", ch, result1);
        }
        else
        {
            // 如果写入失败,输出错误信息
            printf("使用 fputc 写入字符时出现错误。\n");
        }

        // 关闭文件
        fclose(file);
    }
    else
    {
        // 如果文件打开失败,输出错误信息
        printf("打开文件时出现错误。\n");
    }

    return 0;
}

        输出结果如下所示:

4.2 fputs() 函数

4.2.1 功能说明

        fputs() 函数的主要功能是将一个字符串(不包括终止的空字符 '\0')写入指定的文件流中,如果字符串中包含换行符 '\n',fputs 会将其原样写入文件。如果写入成功,该函数返回一个非负值;如果写入失败,返回 EOF。

4.2.2 函数原型

#include <stdio.h>
int fputs(const char *str, FILE *stream);

参数:

  • str:一个指向以 null 结尾的字符串的指针,表示要写入的字符串
  • stream:一个指向 FILE 类型的指针,表示要写入的文件流。这个指针通常是通过 fopen() 函数获得的。

返回值:

  • 如果字符串成功写入文件,返回一个非负值(通常是成功写入的字符数,具体取决于编译器)
  • 如果写入失败,返回 EOF(通常定义为 -1)

4.2.3 案例演示

#include <stdio.h>

int main()
{
    // 打开文件,使用写入模式('w')。如果文件存在,则清空文件;如果文件不存在,则创建新文件
    FILE *file = fopen("./path/files/output2.txt", "w"); // 从头写入

    if (file != NULL)
    {
        // 定义要写入的字符串
        const char *text = "使用写入模式('w')。如果文件存在,则清空文件;如果文件不存在,则创建新文件\n";

        // 使用 fputs 函数写入字符串
        int result = fputs(text, file);

        // 检查 fputs 是否成功
        if (result != EOF)
        {
            // 如果写入成功,输出成功信息及返回值
            printf("成功使用 fputs 写入字符串,返回值:%d。\n", result);
        }
        else
        {
            // 如果写入失败,输出错误信息
            printf("使用 fputs 写入字符串时出现错误。\n");
        }

        // 关闭文件
        fclose(file);
    }
    else
    {
        // 如果文件打开失败,输出错误信息
        printf("打开文件时出现错误。\n");
    }

    return 0;
}

        输出结果如下所示:

4.3 fprintf() 函数

4.3.1 功能说明

        fprintf() 函数的主要功能是将格式化的字符串写入指定的文件流中,如果格式化字符串中包含换行符 '\n',fprintf 会将其原样写入文件。它可以接受多个参数,并根据提供的格式字符串将这些参数格式化后写入文件。如果写入成功,该函数返回写入的字符数;如果写入失败,返回一个负值。

4.3.2 函数原型

#include <stdio.h>
int fprintf(FILE *stream, const char *format, ...);

参数:

  • stream:一个指向 FILE 类型的指针,表示要写入的文件流。这个指针通常是通过 fopen() 函数获得的。
  • format:一个指向以 null 结尾的字符串的指针,表示格式化字符串。格式化字符串可以包含普通字符和格式化说明符(如 %d、%s、%f 等),与 printf 类似。
  • ...:可变参数列表,根据格式化字符串中的说明符提供相应的参数,与 printf 类似。

返回值:

  • 如果写入成功,返回写入的字符数(不包括终止符 '\0')
  • 如果写入失败,返回一个负值

4.3.3 案例演示

#include <stdio.h>

int main()
{
    // 打开文件,使用写入模式('w')。如果文件存在,则清空文件;如果文件不存在,则创建新文件
    FILE *file = fopen("./path/files/output3.txt", "w"); // 从头写入

    if (file != NULL)
    {
        // 定义要写入的格式化字符串
        const char *text = "fprintf: %s is studying in CSDN_Thanks_ks\n";
        char *name = "Alice";

        // 使用 fprintf 函数写入格式化的字符串
        int result = fprintf(file, text, name);

        // 检查 fprintf 是否成功
        if (result != EOF)
        {
            // 如果写入成功,输出成功信息及返回值
            printf("成功使用 fprintf 写入字符串,返回值:%d。\n", result);
        }
        else
        {
            // 如果写入失败,输出错误信息
            printf("使用 fprintf 写入字符串时出现错误。\n");
        }

        // 关闭文件
        fclose(file);
    }
    else
    {
        // 如果文件打开失败,输出错误信息
        printf("打开文件时出现错误。\n");
    }

    return 0;
}

        输出结果如下所示:

4.4 文件写入——综合案例演示

#include <stdio.h>

int main()
{
    // 以追加模式('a')打开文件。如果文件不存在,则会创建一个新文件
    // 如果文件存在,则会在文件末尾追加内容
    FILE *file = fopen("./path/files/output4.txt", "a"); // 追加写入

    if (file != NULL)
    {
        // 使用 fputc 写入一个字符
        char ch = 'A';
        int result1 = fputc(ch, file);

        if (result1 != EOF)
        {
            // 如果 fputc 成功,输出成功信息及返回值
            printf("成功使用 fputc 写入字符 '%c',返回值:%d。\n", ch, result1);
        }
        else
        {
            // 如果 fputc 失败,输出错误信息
            printf("使用 fputc 写入字符时出现错误。\n");
        }

        // 使用 fputs 写入一个字符串
        const char *text = "fputs: Welcome to my blog, I am Thanks_ks\n";
        int result2 = fputs(text, file);

        if (result2 != EOF)
        {
            // 如果 fputs 成功,输出成功信息及返回值
            printf("成功使用 fputs 写入字符串,返回值:%d。\n", result2);
        }
        else
        {
            // 如果 fputs 失败,输出错误信息
            printf("使用 fputs 写入字符串时出现错误。\n");
        }

        // 使用 fprintf 写入格式化数据
        int num = 42;
        float pi = 3.14159;
        const char *formattedText = "fprintf: %d %.2f\n";
        int result3 = fprintf(file, formattedText, num, pi);

        if (result3 >= 0)
        {
            // 如果 fprintf 成功,输出成功信息及返回值
            printf("成功使用 fprintf 写入格式化数据,返回值:%d。\n", result3);
        }
        else
        {
            // 如果 fprintf 失败,输出错误信息
            printf("使用 fprintf 写入格式化数据时出现错误。\n");
        }

        // 关闭文件,释放与文件相关的资源
        fclose(file);
    }
    else
    {
        // 如果文件打开失败,输出错误信息
        printf("打开文件时出现错误。\n");
    }

    return 0;
}

        输出结果如下所示:


5 常见的文件写入方式

5.1 fgetc() 函数

5.1.1 功能说明

        fgetc() 函数的主要功能是从指定的文件流中读取一个字符。如果读取成功,该函数返回读取到的字符;如果到达文件末尾或发生错误,返回 EOF。

5.1.2 函数原型

#include <stdio.h>
int fgetc(FILE *stream);

参数:

  • stream:一个指向 FILE 类型的指针,表示要读取的文件流。这个指针通常是通过 fopen() 函数获得的。

返回值:

  • 如果读取成功,返回读取到的字符(以 int 类型返回,以便区分 EOF)。
  • 如果到达文件末尾或发生错误,返回 EOF(通常定义为 -1)。

5.1.3 案例演示

#include <stdio.h>

int main()
{
    // 以读取模式('r')打开文件 "intput.txt"
    FILE *file = fopen("./path/files/input1.txt", "r"); // 打开文件以供读取

    if (file != NULL)
    {
        int ch; // 用于存储读取的字符

        puts("使用 fgetc 循环读取的文件内容:"); // puts 自带换行效果

        // 使用 fgetc 逐字符读取文件
        while ((ch = fgetc(file)) != EOF)
        {
            // printf("%c", ch); // 将字符显示在屏幕上
            putchar(ch);
        }

        fclose(file); // 关闭文件
    }
    else
    {
        printf("Error opening the file.\n"); // 如果文件打开失败,输出错误信息
    }

    return 0;
}

        input1.txt 内容如下所示:

        输出结果如下所示:

5.2 fgets() 函数

5.2.1 功能说明

        fgets() 函数的主要功能是从指定的文件流中读取一行文本,并将其存储到指定的缓冲区中。如果读取成功,该函数返回指向缓冲区的指针;如果到达文件末尾或发生错误,返回 NULL。

5.2.2 函数原型

#include <stdio.h>
char *fgets(char *str, int n, FILE *stream);

参数:

  • str:一个指向字符数组的指针,表示用于存储读取到的字符串的缓冲区
  • n:一个整数,表示缓冲区的最大长度fgets 最多读取 n-1 个字符,并在末尾添加一个空字符 '\0'
  • stream:一个指向 FILE 类型的指针,表示要读取的文件流。这个指针通常是通过 fopen() 函数获得的。

返回值:

  • 如果读取成功,返回指向缓冲区的指针(即 str)
  • 如果到达文件末尾或发生错误,返回 NULL

5.2.3 案例演示

#include <stdio.h>

int main()
{
    // 以读取模式('r')打开文件 "intput.txt"
    FILE *file = fopen("./path/files/input2.txt", "r"); // 打开文件以供读取

    if (file != NULL)
    {
        char buffer[1000]; // 用于存储读取的字符串

        // 使用 fgets 逐行读取文件
        while (fgets(buffer, sizeof(buffer), file) != NULL)
        {
            // printf("%s", buffer); // 将读取的字符串显示在屏幕上
            puts(buffer);
        }

        fclose(file); // 关闭文件
    }
    else
    {
        printf("Error opening the file.\n"); // 如果文件打开失败,输出错误信息
    }

    return 0;
}

        input2.txt 内容如下所示:

        输出结果如下所示:

5.3 fscanf 函数

5.2.1 功能说明

        fscanf() 函数的主要功能是从指定的文件流中读取格式化的输入,并将数据存储到指定的变量中。它类似于 scanf() 函数,但作用于文件流而不是标准输入。fscanf() 使用空白字符(空格、制表符、换行符等)分隔内容,并将其赋值给不同的变量

5.2.2 函数原型

#include <stdio.h>
int fscanf(FILE *stream, const char *format, ...);

参数:

  • stream:一个指向 FILE 类型的指针,表示要读取的文件流。这个指针通常是通过 fopen() 函数获得的。
  • format:一个指向以 null 结尾的字符串的指针,表示在··在·格式化字符串。格式化字符串可以包含普通字符和格式化说明符(如 %d、%s、%f 等),与 scanf 类似。
  • ...:可变参数列表,根据格式化字符串中的说明符提供相应的指针,与 scanf 类似。

返回值:

  • 如果读取成功,返回成功读取并赋值的项数
  • 如果到达文件末尾或发生错误,返回 EOF

5.2.3 案例演示

#include <stdio.h>

int main()
{
    // 以读取模式('r')打开文件 "input3.txt"
    FILE *file = fopen("./path/files/input3.txt", "r"); // 打开文件以供读取

    if (file != NULL)
    {
        // 定义变量用于存储读取的数据
        char msg1[100], msg2[100], msg3[100]; // 用于存储三个字符串
        int num;                              // 用于存储一个整数

        // 使用 fscanf 从文件中读取格式化的数据
        fscanf(file, "%s %s %s %d", msg1, msg2, msg3, &num);

        // 将读取的数据输出到控制台
        printf("%s\n", msg1); // 输出第一个字符串
        printf("%s\n", msg2); // 输出第二个字符串
        printf("%s\n", msg3); // 输出第三个字符串
        printf("%d\n", num);  // 输出整数

        // 关闭文件
        fclose(file);
    }
    else
    {
        // 如果文件打开失败,输出错误信息
        printf("打开文件时出现错误。\n");
    }

    return 0;
}

        input3.txt 内容如下所示:

        输出结果如下所示:

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

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

相关文章

第四范式发布全新一代文档数字化管理平台Smart Archive 2.0

产品上新 Product Release 今日&#xff0c;第四范式正式推出全新一代文档数字化管理平台——Smart Archive 2.0。该产品基于第四范式自研的文档处理大模型&#xff0c;实现零样本下对企业文档的精准识别及信息提取。文档处理大模型利用二十多个行业&#xff0c;上百种场景下的…

【华为】默认路由配置

1.配置接入层&#xff1a; LSW1&#xff08;LSW3同理&#xff09;: vlan batch 10 20 in g0/0/1 port link-type ac port default vlan 10 in g0/0/2 port link-type ac port default vlan 20 in g0/0/24 port link-type tr port tr allow-pass vlan 10 20 2.配置汇聚层&#x…

Spring Boot 集成 LiteFlow 实现业务流程编排

LiteFlow 是一款轻量级的流程编排框架,它允许开发者通过简单的配置方式,将复杂的业务流程分解为多个独立的节点,然后通过定义规则来编排节点,达到解耦业务逻辑、提高代码可维护性的目的 1. LiteFlow 的基本概念 在 LiteFlow 中,主要有以下几个概念: 节点 (Node):代表一…

2015年国赛高教杯数学建模C题月上柳梢头解题全过程文档及程序

2015年国赛高教杯数学建模 C题 月上柳梢头 月上柳梢头&#xff0c;人约黄昏后”是北宋学者欧阳修的名句&#xff0c;写的是与佳人相约的情景。请用天文学的观点赏析该名句&#xff0c;并进行如下的讨论&#xff1a;   1. 定义“月上柳梢头”时月亮在空中的角度和什么时间称为…

SKG未来健康校招社招入职测评:综合能力及性格问卷SHL测评题库

SKG未来健康科技股份有限公司在校招和社招过程中使用的SHL测评题库主要考察应聘者的综合能力和性格特征。以下是对这些测评的简要分析&#xff1a; 综合能力测评&#xff1a; 测评时间&#xff1a;46分钟&#xff08;实际答题时间36分钟&#xff09; 题目数量&#xff1a;30题…

多jdk版本环境下,jenkins系统设置需指定JAVA_HOME环境变量

一、背景 由于不同项目对jdk版本的要求不同&#xff0c;有些是要求jdk11&#xff0c;有些只需要jdk8即可。 而linux机器上安装jdk的方式又多种多样&#xff0c;最后导致jenkins打包到底使用的是哪个jdk&#xff0c;比较混乱。 1、java在哪 > whereis java java: /usr/bin/…

不到千元的自动猫砂盆是智商税吗?这四大选购技巧不看就亏大了

虽然现在的人都说&#xff0c;猫砂盆等上班一天回来再清理也没有任何关系&#xff0c;但实际上在这一天里&#xff0c;猫咪的粪便已经在猫砂盆里滋生了很多无法察觉的细菌&#xff0c;久而久之就会影响猫咪的健康&#xff0c;导致尿闭&#xff0c;放了一天的便便臭味也让人无法…

数据结构与算法——Java实现 32.堆

人的想法和感受是会随着时间的认知改变而改变&#xff0c; 原来你笃定不会变的事&#xff0c;也会在最后一刻变得释然 —— 24.10.10 堆 堆是基于二叉树实现的数据结构 大顶堆每个分支的上一个节点的权值要大于它的孩子节点 小顶堆每个分支的上一个节点的权值要小于它的孩子…

PyQt5写好的py文件生成可执行的exe文件【Pyinstaller】

文章目录 pyinstaller介绍特点 1.单个py文件2.多个py文件3.程序图标设置4.打包形式(1)单个exe文件(2)文件夹 5.程序开始前的加载中图片6.UPX打包压缩问题解决办法 7.指令总结 pyinstaller介绍 pyinstaller 属于Python第三方库&#xff0c;可以将py文件在不同平台上打包为exe可执…

鸿蒙NEXT开发-沉浸式导航和键盘避让模式(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

架构与思维:漫谈高并发业务的CAS及ABA

1 高并发场景下的难题 1.1 典型支付场景 这是最经典的场景。支付过程&#xff0c;要先查询买家的账户余额&#xff0c;然后计算商品价格&#xff0c;最后对买家进行进行扣款&#xff0c;像这类的分布式操作&#xff0c;如果是并发量低的情况下完全没有问题的&#xff0c;但如果…

企业级私有化即时通讯软件:高效沟通与安全保障的优选

在当今这个信息化高速发展的时代&#xff0c;企业面临着前所未有的沟通挑战与信息安全压力。为了应对这些挑战&#xff0c;企业级私有化即时通讯软件应运而生&#xff0c;它不仅优化了内部沟通流程&#xff0c;还确保了数据的安全性与管理的深度需求得到满足。以下将从“助力大…

k8s部署jenkins集群,配置集群kubernetes plugin的pod模板

一、配置集群 填写k8s地址&#xff1a;https://kubernetes.default.svc.cluster.local 命名空间&#xff1a;kubernetes-plugin Jenkins地址&#xff1a;http://jenkins:18080 Jenkins通道&#xff1a;jenkins:50000 jenkins是容器别名 设置jenkinsslave的标签属性 二、…

2024年CSS @规则(At-rules)新增数量超过过去十年的总和,CSS @规则(At-rules)详解系列目录

2024年CSS 规则(At-rules)新增数量超过过去十年的总和&#xff0c; CSS 规则(At-rules)详解系列目录 本文目录&#xff1a; 零、时光宝盒 一、CSS 规则(At-rules)发展状况 二、什么是CSS 规则(At-rules) 2.1、一些背景 2.2、概念 2.3、CSS规则(At-rules) 规则(At-rules…

快速解决urllib3.exceptions.MaxRetryError: HTTPSConnectionPool

正题 使用pip命令查看urllib3版本 pip list发现版本为 1.26.9 urllib3 v1.26.9此时如下报错&#xff0c;无法正常使用&#xff08;使用了代理&#xff09; urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(hostxxx.xxxxx.com, port443): Max retries exceeded wit…

充电宝租赁管理系统网站毕业设计SpringBootSSM框架开发

目录 1. 概述 2. 技术选择与介绍 3. 系统设计 4. 功能实现 5. 需求分析 1. 概述 充电宝租赁管理系统网站是一个既实用又具有挑战性的项目。 随着移动设备的普及和人们日常生活对电力的持续依赖&#xff0c;充电宝租赁服务已成为现代都市生活中的一项重要便利设施。它不仅为…

多线程(二):Thread类常见的属性和方法

目录 1、run & start 2、Thread类常见的属性和方法 2.1 构造方法 2.2 属性 3、后台进程 & 前台进程 4、setDaemon 5、isAlive 6、终止一个线程 6.1 变量捕获 6.2 currentThread & isInterrupted & interrupt 1、run & start 在多线程&#xff08…

Windows环境mysql 9安装mysqld install报错:Install/Remove of the Service Denied!

Windows环境mysql 9安装mysqld install报错&#xff1a;Install/Remove of the Service Denied! 解决方案&#xff1a; 控制台/批处理命令窗口需要以系统管理员身份运行。 mysql数据库环境配置和安装启动&#xff0c;Windows-CSDN博客文章浏览阅读920次。先下载mysql的zip压缩…

opencv的相机标定与姿态解算

首先我们要知道四个重要的坐标系 世界坐标系相机坐标系图像成像坐标系图像像素坐标系 坐标系之间的转换 世界坐标系——相机坐标系 从世界坐标系到相机坐标系&#xff0c;涉及到旋转和平移&#xff08;其实所有的运动也可以用旋转矩阵和平移向量来描述&#xff09;。绕着不…

Android开发视频预览效果

Android开发视频预览效果 视频播放不是一个简单的事情&#xff0c;得有暂停&#xff0c;继续播放等功能&#xff0c;屏幕的适配也是头疼的事情 一、思路&#xff1a; 引用的是腾讯播放器TXVodPlayer 二、效果图&#xff1a; 图片不是很直观&#xff0c;也可以看下视频 And…