C语言文件操作完全手册:读写·定位·实战

news2025/7/15 20:09:51

1.什么是文件

1.1文件的概念

文件(File)是计算机中用于持久化存储数据的基本单位。它可以存储文本、图片、音频、程序代码等各种信息,并在程序运行结束后仍然保留数据。

1.2文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含三部分:文件路径+文件名主干+文件后缀
例如:C:\code\test.txt
为了方便起见,文件标识常被成为文件名

1.3程序文件和数据文件

文件按内容用途划分可以分为程序文件和数据文件。

程序文件数据文件
使计算机执行特定任务存储程序处理或生成的输入/输出数据
包含可执行代码或支持代码执行的资源结构化或非结构化数据
示例:源代码文件(.c, .java)可执行文件(.exe, .out)库文件(.dll, .so)示例:配置文件(.ini, .json)数据库文件(.db, .sqlite)多媒体文件(.mp3, .jpg)

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

1.4二进制文件和文本文件

根据数据的存储方式和内容的可读性,文件还可以分成二进制文件和文本文件。

文本文件二进制文件
以字符编码(如 ASCII、UTF-8、GBK 等)存储数据,每个字符对应特定的字节序列。以原始字节流(Byte Stream)存储数据,直接对应计算机可识别的二进制格式,不依赖字符编码。
内容可直接用文本编辑器(如记事本、Notepad++)打开并查看,人类可理解。内容无法用普通文本编辑器正确解析,直接查看会显示乱码,需用特定软件(如图片查看器、播放器、编译器)处理。

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

10000的不同存储方式

在vs2022上打开二进制文件:
在这里插入图片描述
在这里插入图片描述

2.文件的打开和关闭

2.1流和标准流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出
操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流
想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?

那是因为C语⾔程序在启动的时候,默认打开了3个流:
• stdin -标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出 流中。
• stderr -标准错误流,⼤多数环境中输出到显⽰器界⾯。

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

2.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编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。
每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信
息,使⽤者不必关⼼细节。
下⾯我们可以创建⼀个FILE*的指针变量:

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

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

在这里插入图片描述

2.3文件打开与关闭函数

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
ANSI C 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

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

mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:
在这里插入图片描述
示例代码:

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "w");

	//如果打开失败,结束程序
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	fputs("hello world", pf);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

3.文件的顺序读写

3.1 fgetc 和 fputc

fgetc 是 C 语言标准库中用于从文件流中读取单个字符的函数,其功能简单但在文件操作中非常实用。函数原型如下:

int fgetc(FILE *stream);

参数:
stream 是指向 FILE 类型的指针,表示要读取的文件流(可以是文件或标准输入 stdin)。
返回值:
成功读取时,返回读取到的字符(转换为 int 类型,范围为 0~255)。
到达文件末尾或发生错误时,返回 EOF(一个宏定义,通常为 -1)。

fgetc详细介绍网页

示例代码:

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "r");

	//如果打开失败,结束程序
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读文件
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c", ch);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

注意:返回值类型为 int 而非 char,原因是需要用 EOF(-1)表示错误或文件结束,而 char 类型无法表示负数。因此,必须用 int 类型接收返回值。

fputc 是 C 语言标准库中用于向文件流写入单个字符的函数,与 fgetc 功能对应,是文件操作中最基础的写入工具之一。函数原型如下:

int fputc(int c, FILE *stream);

参数:
c:要写入的字符(整数类型,通常为 char 类型转换而来,范围 0~255)。
stream:指向 FILE 类型的指针,表示目标文件流(可以是文件或标准输出 stdout)。
返回值:
成功写入时,返回写入的字符(转换为 int,即参数 c 的值)。
写入失败时,返回 EOF(宏定义,通常为 -1)。

fputc详细介绍网页

示例代码:

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "w");

	//如果打开失败,结束程序
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	const char* str = "yuecheng";
	for (int i = 0; str[i] != '\0'; i++)
	{
		fputc(str[i], pf);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

3.2 fgets 和 fputs

fputs 是 C 语言标准库中用于向文件流写入字符串的函数,是文本文件操作的常用工具之一。它与 fputc(逐字符写入)不同,支持批量写入字符串,适用于高效处理文本数据。函数原型如下:

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

参数:
str:指向要写入的字符串(以 ‘\0’ 结尾的字符数组或指针)。
stream:指向目标文件流的指针(如文件指针或标准输出 stdout)。
返回值:
成功写入时,返回一个非负整数(具体值未指定,通常视为成功标志)。
写入失败时,返回 EOF(宏定义,值为 -1)。

fputs详细介绍网页

示例代码:

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "w");

	//如果打开失败,结束程序
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	const char* str1 = "yuecheng";
	const char* str2 = "boke";
	fputs(str1, pf);
	fputs("\n", pf);//手动换行
	fputs(str2, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fgets 是 C 语言标准库中用于从文件流(或标准输入)读取字符串的函数,是文本文件处理和用户输入的重要工具。其核心优势在于安全可控(可指定读取长度,避免缓冲区溢出),适用于逐行读取数据。函数原型如下:

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

参数:
str:指向字符数组的指针,用于存储读取的字符串(需确保缓冲区足够大)。
num:读取的最大字符数(包括终止符 ‘\0’),即最多读取 num-1 个有效字符,末尾自动添加 ‘\0’。
stream:目标文件流(如文件指针 FILE* 或标准输入 stdin)。
返回值:
成功时,返回指向缓冲区 str 的指针(与输入参数相同)。
遇到文件结束或错误时,返回 NULL。

fgets详细介绍网页
示例代码:

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "r");

	//如果打开失败,结束程序
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读文件
	char buff[500] = { 0 };
	while (fgets(buff, sizeof(buff), pf))
	{
		printf("%s", buff);// 输出读取的行(含换行符)
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

3.3 fscanf和fprintf

fprintf 是 C 语言标准库中用于向文件流(或标准输出)写入格式化数据的核心函数,功能与 printf 类似,但目标是文件而非控制台。它支持将不同类型的数据(整数、浮点数、字符串等)按指定格式写入文件,是文本文件处理和日志记录的重要工具。函数原型如下:

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

参数:
stream:目标文件流指针(如文件指针 FILE* 或标准输出 stdout)。
format:格式化字符串(包含普通字符和格式说明符)。
…:可变参数列表(需与格式说明符一一对应)。
返回值:
成功时,返回实际写入的字符数(不包含终止符 ‘\0’)。
失败时,返回负数(具体值未指定,通常用 ferror(stream) 判断错误)。

fprintf详细介绍网页
示例代码:

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "w");

	//如果打开失败,结束程序
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	fprintf(pf, "%-10s %-15s %s\n", "ID", "Name", "Score");
	fprintf(pf, "-------------------------------------------------\n");
	fprintf(pf, "%-10d %-15s %6.2f\n", 1, "Bob", 85.5);
	fprintf(pf, "%-10d %-15s %6.2f\n", 2, "Alice", 92.3);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fscanf 是 C 语言标准库中用于从文件流(或标准输入)读取格式化数据的核心函数,功能与 scanf 类似,但目标是文件而非控制台。它支持按指定格式解析不同类型的数据(整数、浮点数、字符串等),是处理结构化文件(如配置文件、日志、表格数据)的重要工具。函数原型如下:

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

参数:
stream:目标文件流指针(如文件指针 FILE* 或标准输入 stdin)。
format:格式化字符串(包含格式说明符和普通字符)。
…:可变参数列表(需是指针,用于存储读取的数据)。
返回值:
成功时,返回成功匹配的参数个数(可能为 0,表示格式匹配但无数据读取)。
遇到文件结束或错误时,返回 EOF(宏定义,值为 -1)。

fscanf详细介绍网页

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "r");

	//如果打开失败,结束程序
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读文件
	char ch1[10] = { 0 };
	char ch2[10] = { 0 };
	char ch3[10] = { 0 };
	fscanf(pf, "%s %s %s\n", ch1, ch2, ch3);
	printf("%s %s %s", ch1, ch2, ch3);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4. fread 和 fwrite

fwrite 是 C 语言标准库中用于向文件流写入二进制数据块的函数,主要用于高效存储和读取结构化数据(如结构体、数组、二进制文件)。与文本文件操作函数(如 fprintf、fputs)不同,fwrite 直接按字节写入,不进行任何格式转换或字符编码处理,是处理二进制文件的核心工具。函数原型如下:

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

参数:
ptr:指向要写入的数据块的指针(可以是数组、结构体等)。
size:每个数据块的字节大小(如单个元素的大小,如 sizeof(int))。
count:要写入的数据块数量(总字节数为 size × count)。
stream:目标文件流指针(需以 二进制模式 打开,如 wb、ab)。
返回值:
成功时,返回实际写入的数据块数量(类型为 size_t,通常是无符号整数)。
若返回值小于 count,可能是写入错误或文件空间不足,需通过 ferror(stream) 判断。

fwrite详细介绍网页
示例代码:

struct stu {
	char name[20];
	int ID;
	int age;
};

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "wb");

	//如果打开失败,结束程序
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	struct stu stu1 = { "zhangsan",20240523,18 };
	//写文件
	fwrite(&stu1, sizeof(stu1), 1, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fread 是 C 语言标准库中用于从文件流读取二进制数据块的函数,主要用于高效地从文件中恢复结构化数据(如结构体、数组、二进制文件中的数据)。与文本文件读取函数(如 fscanf、fgets)不同,fread 直接按字节读取,不进行任何格式解析或字符编码转换,是处理二进制文件的核心工具。函数原型如下:

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

参数:
ptr:接收数据的缓冲区指针(如结构体地址、数组名)。
size:单个数据块的字节大小(如 sizeof(int)、sizeof(自定义结构体))。
count:期望读取的数据块数量(总读取字节数 = size × count)。
stream:目标文件流(必须以 二进制模式 打开,如 rb、ab+)。
返回值:实际读取的数据块数量(若小于 count,需通过 feof/ferror 判断是文件结束还是错误)。

fread详细介绍网页
示例代码:

struct stu {
	char name[20];
	int ID;
	int age;
};

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "rb");

	//如果打开失败,结束程序
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	struct stu stu2 = { 0 };
	//读文件
	fread(&stu2, sizeof(stu2), 1, pf);
	printf("%s %d %d", stu2.name, stu2.ID, stu2.age);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4.文件的随机读写

1.fseek

根据⽂件指针的位置和偏移量来定位⽂件指针。函数原型如下:

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

函数参数
stream:这是一个指向 FILE 对象的指针,该对象标识了要操作的文件流。在使用 fseek 之前,需要使用 fopen 函数打开文件以获取对应的 FILE 指针。
offset:表示相对于 origin 指定的起始位置的偏移量,单位是字节。这个值可以是正数(表示向文件末尾方向移动)、负数(表示向文件开头方向移动)或者零。
origin:指定了偏移量的起始位置,它是一个整数常量,有以下三种取值:
SEEK_SET:表示从文件的开头开始计算偏移量。
SEEK_CUR:表示从文件指针的当前位置开始计算偏移量。
SEEK_END:表示从文件的末尾开始计算偏移量。
返回值
若函数调用成功,fseek 会返回 0。
若调用失败,则返回一个非零值,同时会设置 errno 来指示具体的错误类型。

fseek详细介绍网页
示例代码:

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;
}

在这里插入图片描述

2.ftell

返回⽂件指针相对于起始位置的偏移量,函数原型如下:

long int ftell ( FILE * stream );

函数参数
stream:这是一个指向 FILE 对象的指针,该对象标识了要操作的文件流。在使用 ftell 之前,需要使用 fopen 函数打开文件以获取对应的 FILE 指针。
返回值
若函数调用成功,ftell 会返回当前文件指针相对于文件开头的偏移量,单位是字节,其类型为 long int。
若调用失败,它会返回 -1L,同时会设置 errno 来指示具体的错误类型。

ftell详细介绍网页
示例代码:

int main()
{
	FILE* pFile;
	long size;
	pFile = fopen("myfile.txt", "rb");//文件内存有A~B26个字母
	if (pFile == NULL)
		perror("Error opening file");
	else
	{
		fseek(pFile, 0, SEEK_END); // non-portable
		size = ftell(pFile);
		fclose(pFile);
		printf("Size of myfile.txt: %ld bytes.\n", size);
	}
	return 0;
}

在这里插入图片描述

3.rewind

让⽂件指针的位置回到⽂件的起始位置,函数原型如下:

 void rewind ( FILE * stream );

函数参数
stream:指向 FILE 对象的指针,该对象代表了要操作的文件流。在调用 rewind 之前,需要使用 fopen 函数打开文件以获取对应的 FILE 指针。
功能描述
rewind 函数会将文件指针移动到文件的起始位置,并且会清除文件流的错误指示器和文件结束指示器。这意味着在调用 rewind 之后,后续的文件操作将从文件开头开始,同时之前可能出现的错误状态也会被重置。
返回值
rewind 函数没有返回值(返回类型为 void)。

rewind详细介绍网页

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);//将文件指针的位置返回到A

	fread(buffer, 1, 26, pFile);//从头读取
	fclose(pFile);

	buffer[26] = '\0';
	printf(buffer);
	return 0;
}

在这里插入图片描述

5.feof和ferror

feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。
牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。
函数原型如下:

int feof(FILE *stream);

返回值
若文件流已到达文件末尾,feof 函数返回一个非零值(通常为 1)。
若未到达文件末尾,则返回 0。

ferror 函数用于检测文件流是否发生了错误。其原型如下:

int ferror(FILE *stream);

返回值
若文件流发生了错误,ferror 函数返回一个非零值(通常为 1)。
若未发生错误,则返回 0。

⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
• fgetc 判断是否为EOF .
• fgets 判断返回值是否为 NULL .
2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
例如:
• fread判断返回值是否⼩于实际要读的个数。

文本文件示例:

int main()
{
	int c; // 注意:int,⾮char,要求处理EOF
	FILE* fp = fopen("test.txt", "r");
	if (!fp) {
		perror("File opening failed");
		return EXIT_FAILURE;
	}
	//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF
	while ((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);
}

二进制文件示例:

enum { SIZE = 5 };
int main()
{
	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 handling
		if (feof(fp))
			printf("Error reading test.bin: unexpected end of file\n");
		else if (ferror(fp)) {
			perror("Error reading test.bin");
		}
	}
	fclose(fp);
}

6.文件缓冲区

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

int main()
{
	FILE* pf = fopen("test.txt", "w");
	fputs("abcdef", pf);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");

	Sleep(10000);

	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)

	printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");
	Sleep(10000);

	fclose(pf);
	//注:fclose在关闭⽂件的时候,也会刷新缓冲区
	pf = NULL;
	return 0;
}

这⾥可以得出⼀个结论:
因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。
如果不做,可能导致读写⽂件的问题。

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

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

相关文章

多模态大语言模型arxiv论文略读(三十七)

A Spectrum Evaluation Benchmark for Medical Multi-Modal Large Language Models ➡️ 论文标题&#xff1a;A Spectrum Evaluation Benchmark for Medical Multi-Modal Large Language Models ➡️ 论文作者&#xff1a;Jie Liu, Wenxuan Wang, Yihang Su, Jingyuan Huan, …

SpringBoot 学习

什么是 SpringBoot SpringBoot 是基于 Spring 生态的开源框架&#xff0c;旨在简化 Spring 应用的初始化搭建和开发配置。它通过约定大于配置的理念&#xff0c;提供快速构建生产级应用的解决方案&#xff0c;显著降低开发者对 XML 配置和依赖管理的负担。 特点&#xff1a; …

VuePress 使用教程:从入门到精通

VuePress 使用教程&#xff1a;从入门到精通 VuePress 是一个以 Vue 驱动的静态网站生成器&#xff0c;它为技术文档和技术博客的编写提供了优雅而高效的解决方案。无论你是个人开发者、团队负责人还是开源项目维护者&#xff0c;VuePress 都能帮助你轻松地创建和管理你的文档…

卷积神经网络--手写数字识别

本文我们通过搭建卷积神经网络模型&#xff0c;实现手写数字识别。 pytorch中提供了手写数字的数据集 &#xff0c;我们可以直接从pytorch中下载 MNIST中包含70000张手写数字图像&#xff1a;60000张用于训练&#xff0c;10000张用于测试 图像是灰度的&#xff0c;28x28像素 …

SQL Server 2019 安装与配置详细教程

一、写在最前的心里话 和 MySQL 对比&#xff0c;SQL Server 的安装和使用确实要处理很多细节&#xff1a; 需要选择配置项很多有“定义实例”的概念&#xff0c;同一机器可以运行多个数据库服务设置身份验证方式时&#xff0c;需要同时配置 Windows 和 SQL 登录要想 Spring …

MyBatisPlus文档

一、MyBatis框架回顾 使用springboot整合Mybatis,实现Mybatis框架的搭建 1、创建示例项目 (1)、创建工程 新建工程 创建空工程 创建模块 创建springboot模块 选择SpringBoot版本 (2)、引入依赖 <dependencies><dependency><groupId>org.springframework.…

Memcached 主主复制架构搭建与 Keepalived 高可用实现

实验目的 掌握基于 repcached 的 Memcached 主主复制配置 实现通过 Keepalived 的 VIP 高可用机制 验证数据双向同步及故障自动切换能力 实验环境 角色IP 地址主机名虚拟 IP (VIP)主节点10.1.1.78server-a10.1.1.80备节点10.1.1.79server-b10.1.1.80 操作系统: CentOS 7 软…

鸿蒙ArkUI之相对布局容器(RelativeContainer)实战之狼人杀布局,详细介绍相对布局容器的用法,附上代码,以及效果图

在鸿蒙应用开发中&#xff0c;若是遇到布局相对复杂的场景&#xff0c;往往需要嵌套许多层组件&#xff0c;去还原UI图的效果&#xff0c;若是能够掌握相对布局容器的使用&#xff0c;对于复杂的布局场景&#xff0c;可直接减少组件嵌套&#xff0c;且随心所欲完成复杂场景的布…

线程函数库

pthread_create函数 pthread_create 是 POSIX 线程库&#xff08;pthread&#xff09;中的一个函数&#xff0c;用于创建一个新的线程。 头文件 #include <pthread.h> 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…

[C]基础13.深入理解指针(5)

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对比 2、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1 代码12.2.2 代码22.2.3 代码32.2.4 …

OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 YUV 色彩空间转换为 RGB。 该函数将输入图像从 YUV 色彩空间转换为 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图像必须是 8…

hbuilderx云打包生成的ipa文件如何上架

使用hbuilderx打包&#xff0c;会遇到一个问题。开发的ios应用&#xff0c;需要上架到app store&#xff0c;因此&#xff0c;就需要APP store的签名证书&#xff0c;并且还需要一个像xcode那样的工具来上架app store。 我们这篇文章说明下&#xff0c;如何在windows电脑&…

Golang | 位运算

位运算比常规运算快&#xff0c;常用于搜索引擎的筛选功能。例如&#xff0c;数字除以二等价于向右移位&#xff0c;位移运算比除法快。

产品动态|千眼狼sCMOS科学相机捕获单分子荧光信号

单分子荧光成像技术&#xff0c;作为生物分子动态研究的关键工具&#xff0c;对捕捉微弱信号要求严苛。传统EMCCD相机因成本高昂&#xff0c;动态范围有限&#xff0c;满阱容量低等问题&#xff0c;制约单分子研究成果产出效率。 千眼狼精准把握科研需求与趋势&#xff0c;自研…

Hot100方法及易错点总结2

本文旨在记录做hot100时遇到的问题及易错点 五、234.回文链表141.环形链表 六、142. 环形链表II21.合并两个有序链表2.两数相加19.删除链表的倒数第n个节点 七、24.两两交换链表中的节点25.K个一组翻转链表(坑点很多&#xff0c;必须多做几遍)138.随机链表的复制148.排序链表 N…

网络:手写HTTP

目录 一、HTTP是应用层协议 二、HTTP服务器 三、HTTP服务 认识请求中的uri HTTP支持默认首页 响应 功能完善 套接字复用 一、HTTP是应用层协议 HTTP下层是TCP协议&#xff0c;站在TCP的角度看&#xff0c;要提供的服务是HTTP服务。 这是在原来实现网络版计算器时&am…

【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析

基于YOLOv5的人脸检测与关键点定位系统深度解析 1. 技术背景与项目意义传统方案的局限性YOLOv5多任务方案的优势 2. 核心算法原理网络架构改进关键点回归分支损失函数设计 3. 实战指南&#xff1a;从环境搭建到模型应用环境配置数据准备数据格式要求数据目录结构 模型训练配置文…

【python】如何将python程序封装为cpython的库

python程序在发布时&#xff0c;往往会打包为cpython的库&#xff0c;并且根据应用服务器的不同架构&#xff08;x86/aarch64&#xff09;&#xff0c;以及python的不同版本&#xff0c;封装的输出类型也是非常多。本文介绍不同架构指定python下的代码打包方式&#xff1a; 首…

计算机组成原理 课后练习

例一&#xff1a; 例二&#xff1a; 1. 原码一位乘 基本原理 原码是一种直接表示数值符号和大小的方式&#xff1a;最高位为符号位&#xff08;0表示正&#xff0c;1表示负&#xff09;&#xff0c;其余位表示数值的绝对值。原码一位乘的核心思想是逐位相乘&#xff0c;并通…

SVN仓库突然没有权限访问

如果svn仓库突然出现无法访问的情况&#xff0c;提示没有权限&#xff0c;所有账号都是如此&#xff0c;新创建的账号也不行。 并且会突然提示要输入账号密码。 出现这个情况时&#xff0c;大概率库里面的文件有http或者https的字样&#xff0c;因为单独给该文件添加权限导致…