C语言进阶第十课 --------文件的操作

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


文件的相关操作

  • **作者前言**
  • 使用文件的意义
  • 什么是文件
    • 程序文件
    • 数据文件
    • 操作对象
    • 文件名
  • 文件的打开和关闭
    • 文件指针
    • 文件的打开和关闭
  • 文件的顺序读写
    • 字符输出函数
    • 字符输入函数
    • 文本字符串输出函数
    • 文本字符串输入函数
    • 格式化输出函数
    • 格式化输入函数
    • 二进制输出函数
    • 二进制输入函数
    • sprintf(将格式化的数据转换成字符串)
    • 将字符串转换成格式化的数据(sscanf)
  • 文件的随机读写
    • fseek(控制光标的位置)
    • 计算起始位置到当前位置的偏移量(ftell)
    • 让文件指针的位置回到文件的起始位置(rewind)
  • 文件的介绍
  • 文件读取结束的判定
    • feof
  • 文件缓冲区

使用文件的意义

前面我们写过很多的代码,运行了很多的程序,但是一旦程序结束了或者断电了,这数据就会不见了,因为这些数据是存储在内存中的,但是使用文件可以有效防止
文件是存在硬盘的

什么是文件

在程序设计中,我们一般谈论两种:一种是程序文件,另一种是数据文件

程序文件

包含有源程序文件(如.c)、目标文件(.obj)、 可执行文件(.exe)

数据文件

数据文件就是被读取数据或者写入数据的文件,或者我们可以理解为我们操作哪个文件哪个文件就是数据文件

操作对象

前面我们使用scanf和printf所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显
示器上。
在这里插入图片描述
现在我们把键盘和屏幕换成了文件,输入就是读取文件内容, 输出就是往文件里面写入数据,
在这里插入图片描述
这里的程序中的数据是保存在内存中的

文件名

一个文件要用一个唯一的文件标识符,以便用户识别和引用
文件名包含三部分:文件路径+文件名主干+文件后缀
例如: C:\a\b.c
C:\a\是文件路径 ,b是文件主干 .c是文件后缀

文件的打开和关闭

文件指针

C语言中每个文件的使用都会在内存开辟一块空间,也就是文件信息区,用来存放文件的相关信息,这些信息是保存在一个名叫FILE类型的结构体变量中,这个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结构的变量,这样使用起来更加方便

那我们可以创建一个FILE*类型的指针来接收这个FILE类型的结构体变量的地址

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

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

那我们怎么找到这个变量的地址呢?,当我们打开一个文件的时候就会创建一个文件信息区,并且自动填充相关信息

文件的打开和关闭

打开
在这里插入图片描述
fopen 函数返回一个指向 FILE 结构体的指针,该结构体用于表示打开的文件。如果打开文件失败,函数将返回 NULL。在使用完打开的文件后,应该使用 fclose 函数关闭文件
filename:文件名
mode:打开方式
这两个参数只需我们传入两个字符串常量就可以,传入字符串常量就会把第一个字符的地址传入进去
打开方式如下:
在这里插入图片描述

关闭
在这里插入图片描述
需要注意的是,fclose 函数将文件缓冲区中的数据写入磁盘,并释放与该文件相关的所有资源。在关闭文件之前,应该确保已完成对文件的所有操作。
如果流成功关闭,则返回零值。
失败时,将返回 EOF。

#include<stdio.h>
int main()
{
	FILE *p = fopen("./test.txt", "w");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	int b = fclose(p);
	printf("%d", b);
	p = NULLreturn 0;
}

文件的顺序读写

前面我们使用scanf和printf是在终端操作的,如果我们要在文件上操作就不能使用这些函数
我们要站在内存的角度思考,写入内存的数据叫输入,从内存中输出数据叫输出
在这里插入图片描述
这个图是一个简便的,文件到程序和文件到程序都不是一步到位的,都要经过一个流,
在这里插入图片描述
本质上我们是操作流来操作文件,我们使用scanf和printf可以直接操作数据,是因为,C语言程序只要运行起来就会打开三个流 :标准输入流(stdin) 、标准输出流(stdout)、 标准错误流(stderr)
stdin、stdout 、stderr的类型都是FILE*类型的

输出流(把数据写入到流,而不是写入到文件)(对象是屏幕):

#include<stdio.h>
#include<stdlib.h>
int main()
{
	//打开文件
	FILE* file = fopen("./test.txt", "w");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	char str;
	int a = 0;
	while ( a < 10)
	{
		scanf("%c", &str);
		getchar();
		fputc(str, stdout);
		a++;
	}
	
	fclose(file);
	file = NULL;
	return 0;
}

输入流(从流中获取数据,而不是从文件里面获取)(对象是键盘):

#include<stdio.h>
#include<stdlib.h>
int main()
{
	//打开文件
	FILE* file = fopen("./test.txt", "w");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	char str;
	
	str = fgetc(stdin);
	printf("%c", str);
	fclose(file);
	file = NULL;
	return 0;
}

文件流:文件变量的地址,也就是fopen返回的地址

字符输出函数

在这里插入图片描述
fputc 函数将字符写入文件后,文件指针会自动向后移动一个字符位置。如果写入成功,函数将返回写入的字符;否则,返回 EOF。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	//打开文件
	FILE* file = fopen("./test.txt", "w");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	char str;
	int a = 0;
	while ( a < 10)
	{
		scanf("%c", &str);
		getchar();
		fputc(str, file);
		a++;
	}
	
	fclose(file);
	file = NULL;
	return 0;
}

字符输入函数

在这里插入图片描述
stream是一个指向文件的指针,指向我们要读取的文件流。函数返回值是读取的字符的ASCII码值,如果到达文件末尾或者读取出错,返回EOF。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE* file = fopen("./test.txt", "r");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	char a;
	int b = 0;
	while (b < 5)
	{
		a = fgetc(file);
		printf("%c ", a);
		b++;
	}
	fclose(file);
	file = NULL;
	return 0;
}

文本字符串输出函数

在这里插入图片描述
,str是要写入的字符串,stream是一个指向文件的指针,指向我们要写入的文件流。函数返回值为非负整数表示成功,如果写入出错,返回EOF。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE* file = fopen("./test.txt", "w");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[30] = "qwertytuio";
	int a = fputs(arr, file);
	printf("%d", a);
	fclose(file);
	file = NULL;
	return 0;
}

文本字符串输入函数

在这里插入图片描述
str是一个指向字符数组的指针,用于存储读取到的字符串;n是要读取的最大字符数(包括空字符);stream是一个指向文件的指针,指向我们要读取的文件流。函数返回值是一个指向存储读取到的字符串的指针,如果到达文件末尾或者读取出错,返回NULL。
需要注意的是在文件中真正读取的字符是 n - 1,或者读取到\n或者读完文件内容就不会继续读下去

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE* file = fopen("./test.txt", "r");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[20];
	fgets(arr, 5, file);
	printf(arr);
	fclose(file);
	file = NULL;
	return 0;
}

格式化输出函数

在这里插入图片描述
如果我们对比printf函数就会发现.fprintf多了stream这个参数,
stream是一个指向文件的指针,指向我们要写入的文件流;format是一个格式化字符串,用于指定写入数据的格式;…表示可变参数,用于提供要写入的具体数据。

成功后,将返回写入的字符总数。
如果发生写入错误,则设置错误指示器(ferror)并返回负数。
如果在写入宽字符时发生多字节字符编码错误,errno 将设置为 EILSEQ 并返回负数。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE* file = fopen("./test.txt", "w+");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	fprintf(file, "%d\n", 123456789);
	char arr[11];
	fclose(file);
	file = NULL;
	//光标回复
	FILE* file1 = fopen("./test.txt", "r");
	if (file1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	fgets(arr, 10, file1);
	printf(arr);
	fclose(file1);
	file1 = NULL;
	return 0;
}

格式化输入函数

在这里插入图片描述
如果和scanf函数对比就会发现fscanf只是多了stream参数
stream 是指向要读取的文件的指针,format 是格式字符串,用于指定要读取的数据类型和格式。

成功后,该函数返回成功填充的参数列表的项数。此计数可以与预期的项目数匹配,也可以由于匹配失败、读取错误或文件末尾的到达而减少(甚至为零)。
如果发生读取错误或在读取时到达文件末尾,则会设置正确的指示器(feof 或 ferror)。并且,如果在成功读取任何数据之前发生任一情况,则返回 EOF。
如果在解释宽字符时发生编码错误,该函数会将 errno 设置为 EILSEQ。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE* file = fopen("./test.txt", "r");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	int a;
	fscanf(file, "%d", &a);
	printf("%d", a);
	fclose(file);
	file = NULL;
	file = fopen("./test.txt", "w");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	fprintf(file, "%d", 11111111);
	fclose(file);
	file = NULL;
	return 0;
}

二进制输出函数

上面的函数是使用在所有输入流和输出流的函数(包含有标准输入、输出流和文件流),一般我们只是使用整形或者字符来写入和输出,只能解决一些,但是如果遇见二进制就不一定行了,下面介绍两个函数用于二进制文件的读写操作
在这里插入图片描述
ptr 是指向要写入文件的数据的指针,size 是每个数据项的大小(以字节为单位),count 是要写入的数据项的数量,stream 是指向要写入的文件的指针。
返回成功写入的元素总数。

int main()
{
	FILE *file = fopen("./test.txt", "wb");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	int arr[10] = {65,67,68,69,70,71,72,73,74};
	fwrite(arr, 4, 9, file);
	fclose(file);
	file = NULL;
	return 0;
}

二进制输入函数

在这里插入图片描述
ptr 是指向要存储读取数据的内存区域的指针,size 是每个数据项的大小(以字节为单位),count 是要读取的数据项的数量,stream 是指向要读取的文件的指针。
返回成功读取的元素总数。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE *file = fopen("./test.txt", "rb");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	int arr[5];
	fread(arr, 4, 5, file);
	fclose(file);
	file = NULL;
	return 0;
}

sprintf(将格式化的数据转换成字符串)

sprintf 是 C 语言标准库中的一个函数,用于将格式化的数据写入字符串。它的使用方式与 printf 类似,但是 sprintf 将输出写入到指定的字符串中,而不是标准输出(屏幕)简单理解就是把屏幕换成字符串中
在这里插入图片描述
str 是指向输出字符串的指针,format 是格式化字符串,后面的 … 表示可变参数列表,用于填充格式化字符串中的占位符。sprintf 的返回值是输出到字符数组中的字符数(不包括空字符)

#include<stdio.h>
#include<stdlib.h>
int main()
{
	char arr[10] = "123456789";
	char arr1[10] = "1111111";
	int a = 100;
	sprintf(arr, "%s", arr1);
	sprintf(arr, "%d", a);
	return 0;
}

就是把arr1的数据写入到arr

将字符串转换成格式化的数据(sscanf)

在这里插入图片描述
str 是要读取的字符串,format 是格式化字符串,后面的 … 表示可变参数列表,用于接收读取到的数据。sscanf 的返回值是成功读取并赋值的参数个数

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	char arr[] = "1000 100 100";
	int arr1[5];
	int b;
	sscanf(arr, "%d %d %d", arr1, arr1 + 1, arr1 + 2);
	return 0;
}

把arr的数据以int类型写入到arr1中

文件的随机读写

fseek(控制光标的位置)

在这里插入图片描述
其中,stream 是一个指向文件的指针,offset 是要定位的偏移量(左负右正),origin 是定位的起始位置。origin 可以取以下值之一:

SEEK_SET:从文件开头开始计算偏移量。
SEEK_CUR:从当前位置开始计算偏移量。
SEEK_END:从文件末尾开始计算偏移量。
fseek 的返回值为 0 表示成功,非零值表示失败。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	FILE *file = fopen("./test.txt", "r+");
	if (file == NULL)
	{
		perror("fopne");
		return 1;
	}
	char a;
	char arr[5];
	//读文件
	a = fgetc(file);
	fseek(file, -1, SEEK_CUR);//当前位置向左移动
	fgets(arr, 5, file);
	printf("%c\n", a);
	printf(arr);
	fclose(file);
	file = NULL;
	return 0;
}

计算起始位置到当前位置的偏移量(ftell)

在这里插入图片描述
stream 是一个指向文件的指针。ftell 的返回值是当前文件指针相对于文件开头的偏移量,如果发生错误则返回 -1。

include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	FILE* file = fopen("./test.txt", "r");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[10];
	fgets(arr, 5, file);
	int a = ftell(file);
	printf("%d", a);
	fclose(file);
	file = NULL;
	return 0;
}

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

在这里插入图片描述
stream 是一个指向文件的指针。rewind 函数会将文件指针移动到文件的开头,相当于调用 fseek(stream, 0, SEEK_SET)。

include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	FILE* file = fopen("./test.txt", "r");
	if (file == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[10];
	fgets(arr, 5, file);
	rewind(file);
	int a = ftell(file);
	printf("%d", a);
	fclose(file);
	file = NULL;
	return 0;
}

文件的介绍

根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。
在这里插入图片描述
这张图是不使用二进制输入的结果
在这里插入图片描述
这张图就是二进制输入的结果,有小端存储
在这里插入图片描述

文件读取结束的判定

feof

这个函数不是用来判断文件是否结束的,很多人误以为这个使用判断文件是否结束的,这种是错误的
文件结束的情况是多种的,而feof函数是用来判断文件结束是否是读取到文件末尾而结束
在这里插入图片描述
检查文件结束指示器
如果设置了与流关联的文件结束指示符,则返回非零值。
否则,返回零。
简单理解就是,当文件遇见文件结束标准 就会返回非0值,否则就会返回0

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	FILE* pf = fopen("./test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	FILE* pf1 = fopen("./test1.txt", "w");
	if (pf1 == NULL)
	{
		perror("fopen");
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		fputc(ch, pf1);
		
	}
	if (feof(pf))
	{
		puts("正常文件结束\n");
	}
	fclose(pf);
	pf = NULL;
	fclose(pf1);
	pf1 = NULL;

	return 0;
}

perror用于输出文件相关的错误信息,而feof用于判断文件指针是否到达文件末尾。
perror主要用于处理文件操作中的错误,而feof主要用于控制文件读取的循环条件。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	FILE* pf = fopen("./test.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int arr1[10] = { 0 };
	int num = fread(arr1, sizeof * arr1, sizeof(arr1) / sizeof *arr1, pf);
	if (num == sizeof(arr1) / sizeof * arr1)
	{
		while (num)
		{
			printf("%d ", arr1[--num]);
		}
	}
	else
	{
		if (ferror(pf))
		{
			
			puts("文件读取到错误\n");
		}
		else if(feof(pf))
		{
			printf("文件正常结束\n");
			
		}
	}

	fclose(pf);
	pf = NULL;





	return 0;
}

ferror用于检测文件操作函数是否发生了错误,而feof用于判断文件指针是否到达文件末尾。
ferror主要用于处理文件操作中的错误,而feof主要用于控制文件读取的循环条件。

文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的
在这里插入图片描述
文件缓冲区是在内存上的
输入输出流(Input/Output Stream)是指用于数据传输的抽象概念。在计算机中,输入流用于从外部获取数据,输出流用于向外部发送数据。输入流和输出流可以与不同的设备或资源进行交互,如键盘、文件、网络等。

缓冲区(Buffer)是用于临时存储数据的内存区域。在输入输出操作中,缓冲区通常与输入输出流相关联。当进行输入操作时,数据会先存储到输入流的缓冲区中;而进行输出操作时,数据会先存储到输出流的缓冲区中。缓冲区的存在可以提高输入输出的效率,减少对底层设备的频繁访问。

使用缓冲区的好处是可以批量处理数据,减少对底层设备的读写次数。当缓冲区被填满或达到一定条件时,数据会被一次性地写入或读取。这样可以提高性能和效率。缓冲区的大小通常是固定的,根据应用程序的需求进行设置。

在C语言中,标准库提供了一系列函数来进行输入输出操作,如fread、fwrite、fgets、fputs等。这些函数会自动将数据从缓冲区读取或写入到输入输出流中。同时,我们也可以使用fflush函数来手动刷新缓冲区,确保数据及时地写入或读取。

总结:

输入输出流用于数据传输,输入流用于获取数据,输出流用于发送数据。
缓冲区是临时存储数据的内存区域,与输入输出流相关联。
缓冲区可以提高输入输出操作的效率,减少对底层设备的频繁访问。
在C语言中,使用标准库函数进行输入输出操作,并自动将数据读取或写入到缓冲区中。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<windows.h>
int main()
{
	FILE* pf = fopen("./test1.txt", "w");
	fputs("abcdef", pf);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
	Sleep(10000);
	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
	//注:fflush 在高版本的VS上不能使用了
	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
	Sleep(10000);
	fclose(pf);
	//注:fclose在关闭文件的时候,也会刷新缓冲区
	pf = NULL;
	return 0;
}

在缓冲区中要想写入数据到文件有两者方法
1.缓冲区满了或者刷新缓冲区会把数据写入到文件
2.程序结束,会把数据写入到文件

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

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

相关文章

HarmonyOS开发Java与ArkTS如何抉择

在“鸿蒙系统实战短视频App 从0到1掌握HarmonyOS”视频课程中&#xff0c;很多学员来问我&#xff0c;在HarmonyOS开发过程中&#xff0c;面对Java与ArkTS&#xff0c;应该选哪样&#xff1f; 本文详细分析Java与ArkTS在HarmonyOS开发过程的区别&#xff0c;力求解答学员的一些…

【我和Python算法的初相遇】——体验递归的可视化篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON数据结构与算法学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 递归的起源 什么是递归? 利用递归解决列表求和问题 递归三定律 递归应用-整数转换为任意进制数 递归可视化 画…

获取虎牙直播源

为了今天得LOL总决赛 然后想着下午看看 但是网页看占用高 就想起来有个直播源 也不复杂看了大概一个小时 没啥问题 进入虎牙页面只有 直接F12 网络 然后 看这个长条 一直在获取 发送 那就选中这个区间 找到都是数字这一条 如果直接访问的话会一直下载 我这都取消了 然后 打开…

ElasticSearch快速入门

一、全文检索 1、什么是全文检索 全文索引是一种通过对文本内容进行全面索引和搜索的技术。它可以快速的在大量文本数据中查找包含特定关键词或短语的文档&#xff0c;并返回相关的搜索结果。 全文检索广泛应用于各种信息管理系统和应用中&#xff0c;如搜索引擎、文档管理系…

「git 系列」git 如何存储代码的?

这里写自定义目录标题 git 文件存储位置git 数据模型示例分析分析前准备命令哈希值 具体示例 不同版本的提交&#xff0c;git 做了什么工作&#xff1f;snapshot vs delta-based vs backup参考资料 git 文件存储位置 想要了解如何存储&#xff0c;首先需要知道存储位置。 当我…

git diff相关命令

git diff相关命令 git diff git diff此命令比较的是工作目录中当前文件和暂存区中的文件差异&#xff0c;也就是修改之后还没有暂存起来的变化内容。因为后续要将工作目录中的文件添加到暂存区。 示例&#xff1a; 当前工作目录下有一个2.txt的文件&#xff0c;文件的内容是…

11 月 18 日 ROS 学习笔记——可视化和调试工具

文章目录 前言一、调试 ROS 节点1. gdb 调试器2. 在 ROS 节点启动时调用 gdb 调试器3. 在 ROS 节点启动时调用 valgrind 分析节点4. 设置 ROS 节点 core 文件转储5. 日志消息1). 输出日志消息2). 设置调试消息级别 二、检测系统状态1. rqt_graph2. 可视化坐标变换3. 保存与回放…

ChinaSoft 论坛巡礼 | 新兴系统软件论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

IOS object-c大屏图表 PNChart 折线图 曲线图

折线图是排列在工作表的列或行中的数据可以绘制到折线图中。折线图可以显示随时间&#xff08;根据常用比例设置&#xff09;而变化的连续数据&#xff0c;因此非常适用于显示在相等时间间隔下数据的趋势。在折线图中&#xff0c;类别数据沿水平轴均匀分布&#xff0c;所有值数…

C语言运算符优先级

优先级表 优先级规则说明 符号的优先级是在混合运算中才讨论表中优先级号越小&#xff0c;优先级越高同一优先级中&#xff0c;看结合性 优先级注意事项 逻辑 与 优先级高于逻辑 或而表示同级逗号优先级最低从整体看&#xff0c;可以简单总结为&#xff1a;算术运算符 > …

大数据HCIE成神之路之数学(2)——线性代数

线性代数 1.1 线性代数内容介绍1.1.1 线性代数介绍1.1.2 代码实现介绍 1.2 线性代数实现1.2.1 reshape运算1.2.2 转置实现1.2.3 矩阵乘法实现1.2.4 矩阵对应运算1.2.5 逆矩阵实现1.2.6 特征值与特征向量1.2.7 求行列式1.2.8 奇异值分解实现1.2.9 线性方程组求解 1.1 线性代数内…

一起学docker系列之四docker的常用命令--系统操作docker命令及镜像命令

目录 前言1 操作 Docker 的命令1.1 启动 Docker1.2 停止 Docker1.3 重启 Docker1.4 查看 Docker 状态1.5 查看 Docker 所有命令的信息1.6 查看某个命令的帮助信息 2 操作镜像的命令2.1 查看所有镜像2.2 搜索某个镜像2.3 下载某个镜像2.4 查看镜像所占空间2.5 删除镜像2.6 强制删…

Java拼图游戏

运行出的游戏界面如下&#xff1a; 按住A不松开&#xff0c;显示完整图片&#xff1b;松开A显示随机打乱的图片。 User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password…

(带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程

源码简介&#xff1a; 1、会员管理&#xff1a; 该系统分为三个级别的会员流程&#xff1a;总站管理员、代理与会员&#xff08;会员有普通会员、中级会员和高级会员三个等级&#xff09;。总站管理员可以添加代理用户并为其充值余额&#xff0c;代理用户可以为普通用户充值余…

ClickHouse建表优化

1. 数据类型 1.1 时间字段的类型 建表时能用数值型或日期时间型表示的字段就不要用字符串&#xff0c;全String类型在以Hive为中心的数仓建设中常见&#xff0c;但ClickHouse环境不应受此影响。 虽然ClickHouse底层将DateTime存储为时间戳Long类型&#xff0c;但不建议存储Long…

电子学会C/C++编程等级考试2021年12月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:输出整数部分 输入一个双精度浮点数f, 输出其整数部分。 时间限制:1000 内存限制:65536输入 一个双精度浮点数f(0 < f < 100000000)。输出 一个整数,表示浮点数的整数部分。样例输入 3.8889样例输出 3 答案: //参…

面向未来的自动化:拥抱机器人即服务(RaaS)

01. RaaS是什么&#xff1f; 对于希望实现业务流程自动化的公司来说&#xff0c;机器人通常是一笔巨大的资本支出。由于机器人非常昂贵&#xff0c;公司可能需要等待数年才能看到投资回报。正是由于这一现实&#xff0c;许多较小的组织无法投资机器人。 但一些机器人公司正在采…

报道 | 2023年12月-2024年2月国际运筹优化会议汇总

2023年12月-2024年2月召开会议汇总&#xff1a; The 16th Annual International Conference on Combinatorial Optimization and Applications (COCOA 2023) Location: Virtual Important dates: Conference: December 11, 2023 (Start) - December 13, 2023 (End) Details…

python图

有向图&#xff1a;图中的每条边都有方向的图叫有向图。此时&#xff0c;边的两个顶点有次序关系&#xff0c;有向边 < u,v>成为从顶点u到顶点v的一条弧&#xff0c;u成为弧尾&#xff08;始点&#xff09;&#xff0c;v成为弧头&#xff08;终点&#xff09;&#xff0c…

项目踩坑之面试遇到的问题及解决

第一点&#xff1a; 问题 遇到的问题之&#xff1a;在实现后台管理端-账户操作的时候&#xff0c;添加员工的时候如果重复添加同一个员工&#xff0c;会触发一个数据库唯一约束异常&#xff0c;但客户端无法清晰的理解这个错误&#xff0c;所以我们就对新增员工的代码进行try…