C语言——文件操作_学习笔记

news2024/11/15 13:43:21

一、引言——为什么使用文件

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

C语言文件操作的意义在于实现数据的持久化,以便于数据的读取、存储和处理,为程序设计提供方便。程序的数据和各种外部设备之间是怎么联系起来的,这里涉及到“流”的概念。

二、流和标准流

2.1 流

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

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

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

2.2 标准流

那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语言程序在启动的时候,默认打开了3个流:

  • stdin - 标准输入流,在大多数的环境中从键盘输入。
  • stdout - 标准输出流,大多数的环境中输出至显示器界面。
  • stderr - 标准错误流,大多数环境中输出到显示器界面。

就是因为默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。stdin、stdout、stderr三个流的类型是:FILE*,通常称为文件指针。
C语言中,就是通过FILE*的文件指针来维护流的各种操作的。

三、文件指针

在C语言中,文件指针用于在程序中操作文件。一个文件指针是一个特殊的结构体变量,每个被使用的文件都在内存中开辟了一个相应的文件信息区,这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE。文件指针用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等。在C语言中,所有的输入/输出操作都是通过文件指针完成的。

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

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

FILE* pf;//创建一个⽂件指针变量

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

四、文件的打开和关闭

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

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

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

  • fopen和fclose函数原型
//打开文件
FILE * fopen ( const char * filename,const char * mode );
//关闭文件
int fclose ( FILE * stream );

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

文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据建立一个新的文件
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建立一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件
  • 实例代码举例
#include <stdio.h>

int main() {
    FILE *file;
    
    // 使用 fopen 函数打开文件
    file = fopen("test.txt", "w");
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }
    
    // 向文件写入内容
    fprintf(file, "Hello, World!");

    // 使用 fclose 函数关闭文件
    fclose(file);

    return 0;
}

在这个例子中,我们首先使用 fopen 函数以写入模式 (“w”) 打开一个名为 “test.txt” 的文件。如果文件无法打开(例如,由于权限问题或文件已存在但不可写),fopen 将返回 NULL,我们在这种情况下打印一条错误消息并返回 1 以指示程序出错。

然后,我们使用 fprintf 函数向文件写入一条消息。在这里,fprintf 的第一个参数是文件指针,第二个参数是格式化字符串,类似于 printf 函数。

最后,需要使用 fclose 函数关闭文件。这是很重要的,因为如果你忘记关闭文件,可能会导致数据丢失或其他不可预知的问题。在大多数情况下,你应该始终确保在完成对文件的操作后关闭它。

五、文件的顺序读写

5.1 顺序读写函数介绍

函数名功能适用于
fgetc字符输入函数(将文件中的数据输入到内存中)所有输入流
fputc字符输出函数所有输出流
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数所有输出流
fread二进制输入文件
fwrite二进制输出文件

5.2 函数应用举例

1.fgetc和fputc函数

fgetc(一次读取文件中的一个字符到内存中)

int fgetc ( FILE * stream );//fgetc函数原型
#include <stdio.h>

int main()
 {
    FILE* file = fopen("data.txt", "r");  // 打开名为 "data.txt" 的文件以供读取

    if (file == NULL) 
    {
        printf("无法打开文件\n");
        return 1;
    }

    char ch;
    while ((ch = fgetc(file)) != EOF) // 读取文件直到遇到文件结束符(EOF)
     { 
        printf("%c", ch);  // 打印每个读取的字符
    }

    fclose(file);  // 关闭文件

    return 0;
}

上面的例子中,把data.txt文件中的所有字符内容打印在屏幕上。
data,txt 事先编辑好内容,文件内容如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述

fputc(一次把内存中的一个字符写入到文件中)

int fputc ( int character, FILE * stream );//fputc函数原型
#include<stdio.h>

int main()
{

	FILE* fp = fopen("data.txt","w");
	char a[] = "hello bit~~";
	for (int i = 0; i < 10; i++)
	{
		fputc(a[i], fp);
	}
	fclose(fp);
	return 0;
}

代码中使用了 fputc 函数将字符串 “hello bit~~” 的前10个字符写入到 “data.txt” 文件中。
在这里插入图片描述

2.fputs和fgets函数

fputs函数一次向一个文件写入一行字符串。

int fputs ( const char * str, FILE * stream );//fputs函数原型
#include <stdio.h>

int main() 
{
    FILE* file = fopen("example.txt", "w");  // 打开一个文件以写入

    if (file == NULL) 
    {
        printf("无法打开文件\n");
        return 1;
    }

    const char* text = "Hello, World!\n";  // 这是我们将要写入的字符串
    fputs(text, file);  // 将字符串写入到 file 指向的文件

    fclose(file);  // 关闭文件

    return 0;
}

运行代码后,代码路径下生成example.txt文件内容如下:
在这里插入图片描述
在上述代码中,fputs 函数接收两个参数:要写入的字符串和一个文件指针。这个函数将字符串写入到文件,然后我们使用 fclose 来关闭文件。

fgets函数一次从一个文件中读取一行字符串。

char * fgets ( char * str, int num, FILE * stream );//fgets函数原型

接下来,我们使用 fgets 来从同一个文件中读取这行字符串:

#include <stdio.h>

int main()
 {
    FILE *file = fopen("example.txt", "r");  // 打开一个文件以读取

    if (file == NULL) 
    {
        printf("无法打开文件\n");
        return 1;
    }

    char buffer[100];  // 创建一个缓冲区来保存文件中的字符串
    fgets(buffer, sizeof(buffer), file);  // 从 file 指向的文件读取字符串到 buffer 中

    printf("%s", buffer);  // 打印读取到的字符串

    fclose(file);  // 关闭文件

    return 0;
}

运行结果如下:
在这里插入图片描述

在这个代码中,fgets 函数接收三个参数:一个目标缓冲区,缓冲区的大小,以及一个文件指针。fgets 将从文件中读取最多大小为缓冲区大小的字符串,并保存到缓冲区中。然后我们使用 printf 来打印读取到的字符串,最后我们再次使用 fclose 来关闭文件。

3.fscanf和fprintf函数

格式化输入输出函数

int fscanf ( FILE * stream, const char * format, ... );//fscanf函数原型
int fprintf ( FILE * stream, const char * format, ... );//fprintf函数原型
//对比scanf和printf
int scanf ( const char * format, ... );
int printf ( const char * format, ... );

通过对以上函数原型的对比可以知道:fscanf和fprintf函数这俩个函数使用十分类似,fscanf和fprintf是多了一个文件指针参数,其他的都和scanf、printf一样。直接看例子:

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("test.txt", "w");

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    int i;
    for (i = 0; i < 10; i++) {
        fprintf(file, "数字 %d\n", i);
    }

    fclose(file);

    return 0;
}

在这个例子中,我们使用 fopen 打开一个名为 “test.txt” 的文件以写入数据。然后使用 fprintf 将一些数字写入到这个文件中。最后,我们使用 fclose 来关闭文件。

然后,我们来看一下 fprintf 的例子:

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("test.txt", "r");

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    char buffer[100];
    while (fscanf(file, "%s", buffer) != EOF) {
        printf("%s\n", buffer);
    }

    fclose(file);

    return 0;
}

在这个例子中,我们使用 fopen 打开一个名为 “test.txt” 的文件以读取数据。然后使用 fscanf 从这个文件中读取字符串,并将其打印出来。当 fscanf 读取到文件结束符(EOF)时,循环终止。最后,我们使用 fclose 来关闭文件。

4. fread和fwrite函数

freadfwrite是C语言中的函数,它们用于从文件中读取和写入数据。

fread函数用于从文件中读取数据,其语法如下:

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

其中,ptr是指向要读取数据的缓冲区的指针,size是每个元素的大小,count是要读取的元素个数,stream是文件流指针。

fwrite函数用于将数据写入文件中,其语法如下:

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

其中,ptr是指向要写入文件的数据的指针,size是每个元素的大小,count是要写入的元素个数,stream是文件流指针。

这两个函数通常用于二进制文件的读写。
在这里插入图片描述
在读写时,必须使用二进制模式,需要注意文件的打开方式(如只读wb、只写rb、追加ab等)以及文件指针的位置。


这里有一个小知识点freadfwrite是有返回值的,freadfwrite的返回值是size_t类型的整数值,表示函数成功读取或写入的元素个数。

正常读取或写入操作情况下,返回值都应该是函数参数中包含的元素个数,即等于size_t count

如果读取或写入操作失败,fread和fwrite将返回一个比预期小的值。例如,如果你试图读取10个元素,但只读取了5个,那么fread将返回5。同样,如果你试图写入10个元素,但只写入了5个,那么fwrite将返回5。

你可以使用fread和fwrite的返回值来检查是否成功读取或写入了预期数量的元素。如果返回值与预期不符,则可能需要处理错误或采取其他措施。


举例
假设你有一个名为“input.txt”的文本文件,其内容如下所示:

This is an example.
It shows how to use fread and fwrite.

下面是一个C程序,它读取“input.txt”文件中的内容,将其写入一个新文件“output.txt”中,并输出成功读取和写入的元素个数:

#include <stdio.h>

int main() {
    FILE *input_file, *output_file;
    char buffer[1024];
    size_t bytes_read, bytes_written;

    // 打开输入文件
    input_file = fopen("input.txt", "rb");
    if (input_file == NULL) {
        fprintf(stderr, "无法打开输入文件!\n");
        return 1;
    }

    // 打开输出文件
    output_file = fopen("output.txt", "wb");
    if (output_file == NULL) {
        fprintf(stderr, "无法打开输出文件!\n");
        fclose(input_file);
        return 1;
    }

    // 使用fread和fwrite进行读写操作
    while ((bytes_read = fread(buffer, sizeof(char), sizeof(buffer), input_file)) != 0) {
        bytes_written = fwrite(buffer, sizeof(char), bytes_read, output_file);
        printf("已读取 %zu 个元素,已写入 %zu 个元素\n", bytes_read, bytes_written);
    }

    // 关闭文件
    fclose(input_file);
    fclose(output_file);

    printf("读取和写入完成!\n");

    return 0;
}

运行该程序后,它将输出以下内容:

已读取 27 个元素,已写入 27 个元素
已读取 27 个元素,已写入 27 个元素
读取和写入完成!

六、文件的随机读写

在C语言中,可以使用以下函数来实现文件的随机读写:

函数名用途
fseek()用于设置文件指针的位置。可以使用的文件指针位置模式包括SEEK_SET(从文件开头算起)、SEEK_CUR(从当前位置算起)和SEEK_END(从文件末尾算起)。
ftell()用于获取当前文件指针的位置。
rewind()让文件指针的位置回到文件的起始位置
fread()用于从文件中读取数据。可以指定读取的元素大小和数量,以及文件指针的位置。
fwrite()用于将数据写入文件中。可以指定要写入的数据大小和数量,以及文件指针的位置。

6.1 fseek

int fseek ( FILE * stream, long int offset, int origin );
int fseek(FILE *stream, long int offset, int origin )
参数:
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset -- 这是相对 whence 的偏移量,以字节为单位。
origin -- 参照点,可以是 SEEK_SET(从文件开始位置开始移动),
          SEEK_CUR(从当前位置开始移动),
          或 SEEK_END(从文件末尾开始移动)。

返回值:
如果成功,则该函数返回零,否则返回非零值。

6.2 ftell

long int ftell ( FILE * stream );
long int ftell(FILE *stream)
参数
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

返回值
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';
 printf(buffer);//等价于printf("%s",buffer);
 return 0;
}

以上代码的运行结果如下:
在这里插入图片描述
以上代码的意思是:

首先使用一个循环,用fputc把大写字母’A’到大写字母‘Z’这26个字符写入到名为’myfile.txt’的文件中,写完之后,这时文件指针指向的位置是文件的末尾,使用rewind()函数,让文件指针的位置回到文件的起始位置,接着再使用fread()函数从头到尾把文件的内容读取到buffer数组中,然后给数组buffer最后一个元素设置为\0,(加上字符串的结束标志),最后使用printf函数,以字符串的形式打印buffer数组中的内容。


6.4 代码举例

使用这些函数可以实现文件的随机读写,例如:

FILE *fp;
char buffer[100];
int num;

fp = fopen("file.txt", "r");  // 打开文件
if(fp == NULL) {
    printf("Error opening file\n");
    return -1;
}

fseek(fp, 10, SEEK_SET);  // 将文件指针移动到第10个字节处
num = fread(buffer, sizeof(char), 20, fp);  // 从当前位置读取20个字节,存储到buffer数组中
fclose(fp);  // 关闭文件

上述代码中,首先使用fopen()函数打开文件,然后将文件指针移动到第10个字节处,从当前位置读取20个字节并将其存储到buffer数组中,最后使用fclose()函数关闭文件。

七、文件读取结束的判定

C语言文件操作过程中,避免不了对文件结束的判定,特别是读取文件数据到内存中去的时候,不可能让程序一直读取文件中的内容不停止,而是当文件中所有内容都读到内存中后,结束文件读取的操作。

7.1 feof

关于文件结束的判定,首先要了解一个函数feof

int feof ( FILE * stream );//函数原型

该函数的返回值有两种可能:
如果文件读取操作结束不是 因为文件已经到达末尾,feof() 函数返回 0,即 false。
如果文件读取操作结束是因为文件已经到达末尾,feof() 函数返回非零值,即 true。

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

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

以下是使用feof()函数的基本例子:

#include <stdio.h>

int main() 
{
    FILE *file = fopen("test.txt", "r");
    if (file == NULL) 
    {
        printf("Failed to open file\n");
        return 1;
    }

    char ch;
    while (!feof(file)) 
    {
        ch = fgetc(file);
        if (ch != EOF) 
        {
            printf("%c", ch);
        }
    }

    fclose(file);
    return 0;
}

在这个例子中,我们使用fgetc()函数一次读取一个字符,然后使用feof()检查是否到达文件末尾。如果feof(file)返回非零值,就意味着文件正常读取结束,文件指针已经到达文件末尾,所以循环停止。

需要注意的是,即使在最后一次读取之后,feof()仍然会返回非零值,因为它只是在读取操作之前检查文件状态。换句话说,如果你在最后一次读取操作之后再次调用feof(),它仍然会返回非零值。如果你想在最后一次读取操作之后确认文件已经读取结束,你需要使用ferror()函数来检查是否有其他错误发生。

7.2 fgets()或者getc()

另一种判定文件是否已经读取到结束的方法是使用fgets()或getc()等读取函数读取文件,然后检查结果是否为EOF。例如:

#include <stdio.h>

int main() 
{
    FILE *file = fopen("test.txt", "r");
    if (file == NULL)
     {
        printf("Failed to open file\n");
        return 1;
    }

    char buffer[100];
    while (fgets(buffer, 100, file) != NULL)
     {
        printf("%s", buffer);
    }

    fclose(file);
    return 0;
}

在这个例子中,我们使用fgets()函数一次读取一行,当fgets()返回NULL时,意味着已经到达文件末尾。

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

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

相关文章

仅用61行代码,你也能从零训练大模型

本文并非基于微调训练模型&#xff0c;而是从头开始训练出一个全新的大语言模型的硬核教程。看完本篇&#xff0c;你将了解训练出一个大模型的环境准备、数据准备&#xff0c;生成分词&#xff0c;模型训练、测试模型等环节分别需要做什么。AI 小白友好~文中代码可以直接实操运…

C++ 类和对象篇(三) 空类和6个默认成员函数

目录 一、空类 1. 是什么&#xff1f; 2. 空类中的成员 3. 空类的大小 二、6个默认成员函数 三、 构造函数 1. 构造函数是什么&#xff1f; 2. 为什么C要引入构造函数&#xff1f; 四、析构函数 1. 析构函数是什么&#xff1f; 2. 为什么要有析构函数&#xff1f; 五、拷贝构造…

硬件信号协议UART是干啥的?

UART协议是电子传输中一种常见的信号协议&#xff0c;通常只需要三根信号线就可以完成数据的收发&#xff0c;分别是TX&#xff0c;RX&#xff0c;GND。 UART(universal asynchronous receiver transmitter)&#xff0c;是通用异步收发器&#xff0c;因为是异步&#xff0c;所以…

312.戳气球

将戳气球转换到添加气球&#xff0c;记忆搜索slove(i,j)&#xff1a;在开区间(i,j)全部填满气球得到的最多硬币数&#xff0c;两端val[i]、val[j] class Solution { public:vector<vector<int>> ans;vector<int> val;int slove(int left,int right){if(left&…

分布式存储系统如何应对SSD硬盘UNC坏块可靠性问题?

Uncorrectable Bit Errors&#xff08;UNC&#xff09;&#xff0c;也有时候叫做Media Error&#xff08;介质错误&#xff09;是指在闪存设备中出现的无法修复的位错误。Media Error的产生意味着即使硬盘自身已经用尽了所有容错手段&#xff08;如LDPC解码&#xff0c;retry等…

75.颜色分类

原地排序&#xff1a;空间复杂度为1 class Solution { public:void sortColors(vector<int>& nums) {if(0){//法一&#xff1a;单指针两个遍历int nnums.size();int ptr0;for(int i0;i<n;i){if(nums[i]0){swap(nums[i],nums[ptr]);ptr;}}for(int iptr;i<n;i){…

win11安装双系统Ubuntu的坎坷记录

之前一直装的都是在一个硬盘中&#xff0c;这是是两块盘。 我的电脑是惠普暗影精灵8Pro 一 安装前的准备工作 1.1 记得先关闭&#xff0c;Bitlocker 输入wins&#xff0c;搜索框输入&#xff1a;设备加密设置 1.2 BIOS设置 &#xff08;惠普这电脑是开机时按 F10&#xff0…

断点测试怎么做,一文教你用Charles 工具做好接口测试!

在测试工作过程中&#xff0c;我们经常会在程序的某一行或者某一环节设置断点&#xff0c;在程序请求的过程中&#xff0c;修改断点处的参数、请求或者响应&#xff0c;这就是所谓的断点测试。这类断点测试主要用于接口测试。 断点测试可以通过查看接口返回数据可以方便定位是前…

015-衍生版本开发

衍生版本开发 文章目录 衍生版本开发项目介绍衍生版本开发波形分析设置CPU 亲缘性 总结 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&#…

【Linux】基本指令-入门级文件操作(一)

目录 前言 ⭕linux的树状文件结构 ⭕绝对路径和相对路径 ⭕当前路径和上级路径 ⭕隐藏文件 基本指令&#xff08;重点&#xff09; 1 pwd 指令 2 mkdir 指令 3 touch 指令 4 ls 指令 4.1 ls只加选项不加文件/目录名&#xff0c;默认查看当前目录下的文件 4.1.1 ls -a…

360 G800行车记录仪,不使用降压线如何开机,8芯插头的定义。

G800记录仪的插头是这样的&#xff0c;图中标出了线的颜色。其中红色为常电V&#xff0c;黑色为GND负极&#xff0c;黄色为ACC受车是否启动控制。 这个记录仪原装的电源线没有降压功能&#xff0c;所以这里的V是12V。 记录仪内部有电源板&#xff0c;负责将12V降压为5V。 如果…

CSS盒子定位的扩张

定位的扩展 绝对定位&#xff08;固定定位&#xff09;会完全压住盒子 浮动元素不会压住下面标准流的文字&#xff0c;而绝对定位或固定位会压住下面标准流的所有内容 如果一个盒子既有向左又有向右&#xff0c;则执行左&#xff0c;同理执行上 显示隐藏 display: none&…

Tasmota系统之MQTT配置和使用篇

Tasmota系统之MQTT配置和使用篇 &#x1f6a9;相关篇《ESP32/ESP8266在线刷写Sonoff Tasmota固件以及配置简要》&#x1f4cc;《Tasmota系统之外设配置》&#x1f4cd;Tasmota官方对MQTT功能使用介绍&#xff1a;https://tasmota.github.io/docs/MQTT/ &#x1f6e0;MQTT本地化…

消息队列 Kafka

Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域 为什么使用消息队列MQ 在高并发环境下&#xff0c;同步请求来不及处理会发生堵塞&#xff0c;从而触发too many conne…

团队协作中如何处理ConflictingBeanDefinitionException异常

&#x1f47c; 前言 当使用Spring框架进行Java应用程序开发时&#xff0c;可能会遇到ConflictingBeanDefinitionException异常。 如&#xff1a; org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘xxxBean’ …

Spring5应用之AOP注解编程

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言开发…

2.1 Qemu系统模拟:简介

目录 1 后端/加速器2 特性简介3 运行 1 后端/加速器 系统模拟主要用于在host设备上运行guest OSQEMU支持多种hypervisors,同时也支持JIT模拟方案&#xff08;TCG&#xff09; 例如从上表我们可以看出&#xff0c;运行在x86硬件上的Linux系统支持KVM,Xen,TCG 2 特性简介 提供…

【kubernetes】带你了解k8s中PV和PVC的由来

文章目录 1 为什么需要卷(Volume)2 卷的挂载2.1 k8s集群中可以直接使用2.2 需要额外的存储组件2.3 公有云 2 PV(Persistent Volume)3 SC(Storage Class) 和 PVC(Persistent Volume Claim)4 总结 1 为什么需要卷(Volume) Pod是由一个或者多个容器组成的&#xff0c;在启动Pod中…

C++11(下)

目录 一、类的新功能1.1 默认成员函数1.2 类成员变量初始化1.3 强制生成默认函数的关键字default1.4 禁止生成默认函数的关键字delete1.5 继承和多态中的final与override关键字 二、可变参数模板三、lambda表达式3.1 C98中的一个例子3.2 lambda表达式3.3 lambda表达式语法3.4 函…

CUDA----window更新升级cuda版本

在安装库的过程中发现cuda版本不匹配。我torch安装的是11.7&#xff0c;但是我电脑上安装的是11.2故想升级。 但是我用nvidia-smi命令查询cuda是12.2&#xff0c;这让我费解&#xff0c;后来发现是得使用nvcc -V来查询安装的cuda版本。 详细的升级过程可以看这篇博客&#xff…