C语言 文件操作

目录

  • 1. 什么是文件?
  • 2. 二进制文件和文本文件
  • 3. 文件的打开和关闭
    • 3.1 流和标准流
      • 3.1.1 流
      • 3.1.2 标准流
    • 3.2 文件指针
    • 3.3 打开、关闭文件
      • 3.3.1 fopen - 打开文件
      • 3.3.2 fclose - 关闭文件
  • 4. 文件的顺序读写
    • 4.1 fgetc - 从文件流获取一个字符
    • 4.2 fputc - 将一个字符写入文件流
    • 4.3 fgets - 从文件流获取一个字符串
    • 4.4 fputs - 将一个字符串写入文件流
    • 4.5 fscanf - 格式化输入
    • 4.6 fprintf - 格式化输出
    • 4.7 fwrite - 写入到文件
    • 4.8 fread - 从文件读取
  • 5. 文件的随机读写
    • 5.1 fseek - 移动光标
    • 5.2 ftell - 返回偏移量
    • 5.3 rewind - 重置光标位置
  • 6. 文件读取结束的判定
    • 6.1 feof - 检查文件结尾
  • 7. 文件缓冲区


正文开始

1. 什么是文件?

使用文件来持久化的保存数据,在程序设计中,根据文件功能,我们可以分为两种文件:程序文件、数据文件

  • 程序文件:包括源文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行文件(windows环境后缀为.exe)
  • 数据文件:文件的内容为程序运行时读写的数据

本文讨论的是数据文件
之前我们处理数据的输入和输出都是以终端为对象的,即从终端输入数据,运行结果显示到显示器上
而以文件为对象处理数据的输入和输出,就是将数据输出到磁盘上,并且需要时从磁盘上把数据读取到内存中使用

文件名:为了用户识别和引用文件,一个文件要有一个唯一的文件标识。
文件名包含三部分:文件路径+文件名主干+文件后缀

例如:
在这里插入图片描述

2. 二进制文件和文本文件

从数据的组织形式的角度来看,数据文件分为文本文件或者二进制文件

  • 二进制文件:数据在内存中以二进制的形式存储,若不加转换的输出到外存(磁盘)的文件中,就是二进制文件(例如目标文件)。
  • 文本文件:数据在内存中以二进制的形式存储,若以ASCII字符的形式转换并存储的文件就是文本文件(就比如记事本创建的文本文档)。

一个数据在文件中的存储分为两种情况:

  • 字符数据:一律以对应的ASCII码的形式存储
  • 数值型数据:既可以看作字符,使用ASCII码形式存储,也可以看作数,使用二进制形式存储。例如数值10000的存储方式如下:
    在这里插入图片描述

3. 文件的打开和关闭

3.1 流和标准流

3.1.1 流

流是一个抽象的概念,用来描述数据从源到目的地的过程。流分为输出流和输入流。一般情况下,我们要想从流里写数据,或者从流中读取数据,都是要打开流,然后操作。

3.1.2 标准流

当我们启动C语言程序时,默认打开了三个标准流:

  • stdin - 标准输入流,在大多数环境中从键盘输入,scanf 函数就是从标准输入流中读取数据。
  • stdout - 标准输出流,大多数的环境中输出至显示器界面,printf 函数就是将信息输出到标准流中。
  • stderr - 标准错误流,大多数环境中输出到显示器界面

这是默认打开的三个标准流,我们使用 scanf、printf 等函数就可以直接进行输入输出操作

上述三个流的类型是:FILE*,称为文件指针。C语言中,就是通过文件指针来维护流的各种操作。

3.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;

每当打开一个文件,系统都会根据这个文件的情况自动创建一个 FILE 结构的变量,并填充其中的信息。

一般都是通过一个 FILE 类型的指针来维护这个 FILE 结构的变量,例如:

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

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

3.3 打开、关闭文件

3.3.1 fopen - 打开文件

函数原型:

FILE *fopen( const char *filename, const char *mode );

作用:打开文件。该函数和下文所将函数使用均须引用头文件stdio.h>>>详情戳我

fopen 用法:

  • mode用来确定文件访问模式
  • fopen 函数按照指定模式,打开filename所指向的文件
  • 若打开成功,则返回指向新文件流的指针;若打开失败,则返回空指针

mode表示文件访问模式:

mode含义若指定文件已存在若指定文件不存在
“r”(只读)打开文本文件以读取从头读出错
“w”(只写)打开文本文件以写入销毁內容创建新文件
“a”(追加)向文本文件末尾添加数据写到结尾创建新文件
“rb”(只读)打开二进制文件以读取从头读出错
“wb”(只写)打开二进制文件以写入销毁內容创建新文件
“ab”(追加)向二进制文件末尾添加数据写到结尾创建新文件
“r+”(读写)打开文件以读/写从头读错误
“w+”(读写)打开文件以读/写销毁内容创建新文件
“a+”(读写)打开文件以在末尾读/写写到结尾创建新文件
“rb+”(读写)打开二进制文件以读/写从头读错误
“wb+”(读写)打开二进制文件以读/写销毁内容创建新文件
“ab+”(读写)打开二进制文件以在末尾读/写写到结尾创建新文件

3.3.2 fclose - 关闭文件

函数原型:

int fclose( FILE *stream );

作用:关闭已打开的文件

fclose 用法:

  • 关闭 stream 文件流
  • 关闭成功返回0;关闭失败返回EOF

例如:

#include <stdio.h>
int main()
{
	FILE *pf;
	//打开文件
	pf = fopen("C/test.txt","w");
	
	//判断是否打开成功
	if(pf == NULL)
	{
		return 1;
	}
	
	//使用文件
	//...
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	
	return 0;
}

4. 文件的顺序读写

当我们打开文件并进行操作的时候,常用的操作就是对文件进行读和写,而顺序读写就是按照文件中数据的顺序来以此读写,这表现为文件光标位置随读写操作变动,即每读取或写入一个字符都会将光标向后移动一个字符

注:在程序中使用文件的数据叫做”读“(输入);将程序中数据写入进文件叫”写“(输出)
下面我们来学习一下相关函数:

函数名功能适用于
fgetc字符输入函数所有输入流
fputc字符输出函数所有输出流
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数所有输出流
fread二进制输入文件
fwrite二进制输出文件

上面所说适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)
fread 和 fwrite 是以二进制形式输入输出,并且只能对文件流进行操作;而其他函数都是以文本的形式输入输出,并且可以对所有流进行操作

4.1 fgetc - 从文件流获取一个字符

函数原型:

int fgetc( FILE *stream );

作用:从给定的输入流读取下一个字符

fgetc 用法:

  • 读取stream流中的下一个字符
  • 读取成功返回所读取字符的ASCII码值;读取失败或读取到文件末尾返回EOF(-1)
  • 每读取一次光标都向后移动一下

例如:

#include <stdio.h>
int main()
{
	FILE* pf;
	//打开文件
	pf = fopen("test.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;
}

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

4.2 fputc - 将一个字符写入文件流

函数原型:

int fputc( int ch, FILE *stream );

作用:将指定字符写入指定文件流

fputc 用法:

  • ch为要写入文件的字符
  • stream为输出流,即指定文件
  • 写入成功则返回被写入的字符的ASCII码值;写入失败则返回EOF(-1)
  • 每写入一次光标向后移动一下

例如:

#include <stdio.h>
int main()
{
	FILE* pf;
	//打开文件
	pf = fopen("test.txt", "a");

	//判断是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//使用文件
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		fputc('Q', pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	
	return 0;
}

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

4.3 fgets - 从文件流获取一个字符串

函数原型:

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

作用:从指定文件中读取指定数量的字符,并将他们存储在一个字符数组中

fgets 用法:

  • str指向一个字符数组,会将读取到的字符存储进该数组
  • count为要读取字符的个数
  • stream为读取数据来源的文件流
  • 读取成功返回str;读取失败或读取到文件末尾则返回空指针
  • 该函数只能读取同一行內容,若读取到一行的末尾,则停止读取,并读取一个\n
  • 每次读取光标向后移动count个字符

例如:

#include <stdio.h>
int main()
{
	FILE* pf;
	//打开文件
	pf = fopen("test.txt", "r");

	//判断是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//使用文件
	char arr[20] = { 0 };
	fgets(arr, 20, pf);
	printf("%s", arr);
	fgets(arr, 20, pf);
	printf("%s", arr);

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

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

4.4 fputs - 将一个字符串写入文件流

函数原型:

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

作用:将指定字符串写入到输出流中

fputs 用法:

  • str是要写入输出流的字符串
  • stream是输出流
  • 写入成功返回非负值;写入失败返回EOF

例如:

#include <stdio.h>
int main()
{
	FILE* pf;
	//打开文件
	pf = fopen("test.txt", "w");

	//判断是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//使用文件
	fputs("Hello World!", pf);
	fputs("Hello wwangxu!", pf);

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

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

4.5 fscanf - 格式化输入

函数原型:

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

作用:从文件流流中格式化读取数据,并将数据赋给对应的变量

fscanf 用法:

  • stream为要读取的输入文件流
  • format指向要读取的格式字符,例如%d %f %c
  • 为对应的接收数据的实参
  • 函数返回值为被成功复制的接收参数的数量

例如:

#include <stdio.h>

struct Stu
{
	char name[20];
	char sex[10];
	int age;
};
int main()
{
	struct Stu s;
	FILE* pf;
	//打开文件
	pf = fopen("test.txt", "r");

	//判断是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//使用文件 - 从文件中读取数据并赋值给实参
	fscanf(pf, "%s %s %d", s.name, s.sex, &(s.age));
	printf("%s %s %d", s.name, s.sex, s.age);

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

	return 0;
}

运行结果:
在这里插入图片描述
上述代码就是将test.txt文件中的数据读取出来,分别赋给了三个结构体成员变量中

scanf、sscanf 和 fscanf 的区别:

  • scanf 的输入流是标准输入流(stdin),也就是从键盘读取数据并赋给相应变量
  • sscanf 的输入流是一个字符串,也就是从一个字符串中格式化读取数据并赋给相应变量
  • fscanf 的输入流是文件流(stream),是从文件中读取数据并赋给相应变量

4.6 fprintf - 格式化输出

函数原型:

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

作用:把数据格式化输出到文件中

fprintf 用法:

  • stream为要写入的文件输出流
  • format指向要读取的格式字符,例如%d %f %c
  • 为要写入数据的参数
  • 返回值为传输到文件流的字符数

例如:

#include <stdio.h>

struct Stu
{
	char name[20];
	char sex[10];
	int age;
};
int main()
{
	struct Stu s = {"张三", "男", 18};
	FILE* pf;
	//打开文件
	pf = fopen("test.txt", "w");

	//判断是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//使用文件
	fprintf(pf, "%s %s %d", s.name, s.sex, s.age);

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

	return 0;
}

运行结果:
在这里插入图片描述
上述代码将一个结构体的成员变量格式化的输出到了指定的文件流中,也就是将s的成员变量中的数据存储进test.txt文件中

printf、sprintf 和 fprintf 的区别:

  • printf 是将数据格式化的输出到标准输出流(stdout),也就是输出到屏幕上
  • sprintf 是将数据转换为字符,并输出到指定字符串
  • fprintf 是将数据格式化的输出到文件流(stream),也就是输出到文件中

4.7 fwrite - 写入到文件

函数原型:

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

作用:从指定数组中读取数据,并以二进制的形式写入到文件中

fwrite 用法:

  • stream为指向输出流的指针
  • count为要被写入的对象数
  • size为每个对象的大小
  • buffer指向一个数组,函数会将该数组中的数据以二进制形式写入指定文件流
  • 函数返回值为成功写入的对象数

例如:

#include <stdio.h>

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	FILE* pf;
	//打开文件
	pf = fopen("test.txt", "w");

	//判断是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//使用文件
	int sz = sizeof(arr) / sizeof(arr[0]);
	fwrite(arr, sizeof(int), sz, pf);

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

	return 0;
}

运行结果:
在这里插入图片描述
我们可以看到,存储进文件的数据成了乱码,这是因为 fwrite 函数是以二进制的形式存储数据进文件的,而该文件是文本文件,所以会产生乱码,我们可以通过 fread 函数来查看二进制数据

4.8 fread - 从文件读取

函数原型:

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

作用:从文件中读取二进制数据并存储进指定数组中

fread 用法:

  • stream为读取来源的输入文件流
  • count为读取的对象的个数
  • size为每个对象的大小,单位是字节
  • buffer是一个指向数组的指针,读取到的数据将会存储在这个数组中
  • 函数返回值为成功读取的对象数

例如:

#include <stdio.h>
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int arr2[5] = { 0 };
	FILE* pf;
	//打开文件
	pf = fopen("test.txt", "r");
	//判断是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//使用文件
	
	//写入数据
	//int sz = sizeof(arr) / sizeof(arr[0]);
	//fwrite(arr, sizeof(int), sz, pf);

	// 读取文件內容
	fread(arr2, sizeof(int), 5, pf);
	
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	
	return 0;
}

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

5. 文件的随机读写

上面我们所讲的都是文件的顺序读写,也就是每读写一个对象,光标都会对应向后移动。接下来我们来学习一下文件的随机读写,这可以让我们对数据进行精准的定位并操作。

5.1 fseek - 移动光标

函数原型:

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

作用:在指定文件流中移动文件位置指示器(光标)

fseek 用法:

  • stream为要修改的文件流
  • offset为光标的偏移量
  • origin为光标的起始位置,它有以下三个值:
    • SEEK_SET:文件的起始位置
    • SEEK_CUR:文件指针当前位置
    • SEEK_END:文件末尾
  • 成功时返回0,失败返回非零

例如:

#include <stdio.h>

int main()
{
	char str[30];
	//打开文件
	FILE* pf = fopen("test.txt", "wb+");
	//验证是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写入
	fputs("I am wwangxu", pf);
	//移动光标
	fseek(pf, 4, SEEK_SET);

	//输出
	int i = 0;
	while (fread(&str[i], sizeof(char), 1, pf))
	{
		printf("%c", str[i]);
		i++;
	}

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

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

5.2 ftell - 返回偏移量

函数原型:

long ftell( FILE *stream );

作用:返回stream所指文件的文件位置指示器相对于起始位置的偏移量

例如:

#include <stdio.h>

int main()
{
	char str[30];
	//打开文件
	FILE* pf = fopen("test.txt", "wb+");
	//验证是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写入
	fputs("I am wwangxu", pf);
	//移动光标到文件末尾
	fseek(pf, 0, SEEK_END);
	//获取了文件数据的数量
	int x = ftell(pf);
	printf("%d\n", x);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

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

5.3 rewind - 重置光标位置

函数原型:

void rewind( FILE *stream );

作用:让stream所指向文件的文件位置指示器的位置回到文件的起始位置

例如:

#include <stdio.h>

int main()
{
	char str[30];
	//打开文件
	FILE* pf = fopen("test.txt", "w+");
	//验证是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写入
	fputs("I am wwangxu", pf);
	//移动光标
	fseek(pf, 5, SEEK_SET);
	//输出
	int ch1 = fgetc(pf);
	printf("%c\n", ch1);
	//重置光标位置
	rewind(pf);
	//输出
	int ch2 = fgetc(pf);
	printf("%c\n", ch2);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

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

6. 文件读取结束的判定

文件读取结束有两种情况:

  • 读取到文件末尾,正常结束(使用feof函数判断)
  • 读取发生错误(使用ferror函数判断)

6.1 feof - 检查文件结尾

函数原型:

int feof( FILE *stream );

作用:检查文件是否是因为读取到文件末尾而结束的

feof 用法:

  • 检查对stream指向的文件是否读取到文件末尾
  • 若读取到文件流末尾则返回非零值,否则为0

例如:

#include <stdio.h>
int main()
{
	char str[30];
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//验证是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写入
	char ch = 0;
	for (ch = 'a'; ch <= 'z'; ch++)
	{
		fputc(ch, pf);
	}
	//判断读取结束的原因
	if (feof(pf))
	{
		printf("遇到文件末尾,读取正常结束\n");
	}
	else if (ferror(pf))
	{
		perror("fgetc");//读取失败,异常结束,报错
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

运行结果:
在这里插入图片描述
上述代码中,以“读”的方式打开文件,但是后续却又写入,这就导致读取失败,使用ferror函数来判文件是否为读取失败导致的结束,使用perror函数将错误信息打印出来。

7. 文件缓冲区

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

在这里插入图片描述


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

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

相关文章

金融业开源软件应用 评估规范

金融业开源软件应用 评估规范 1 范围 本文件规定了金融机构在应用开源软件时的评估要求&#xff0c;对开源软件的引入、维护和退出提出了实现 要求、评估方法和判定准则。 本文件适用于金融机构对应用的开源软件进行评估。 2 规范性引用文件 下列文件中的内容通过文中的规范…

智能制造数字工厂未来三年规划方案(80页ppt下载)

一、资料介绍 智能制造数字工厂未来三年规划方案是一份全面而深入的战略性文件&#xff0c;旨在指导我们公司在未来三年内实现智能制造领域的跨越式发展。这份80页的PPT资料&#xff0c;以“智能制造、智能制造系统、数字化工厂、数字孪生工厂、智能工厂和数字化车间”为核心关…

Amesim基础篇-热仿真常用模型库-Electrical Basics/Electric Storage

前言 在动力电池仿真中中我们不免会用到该元件库中的模型&#xff0c;该库中包含基本的电路元件与电池模型。具体的相关模型介绍如下&#xff1a; 1 电压源、电流源、功率源、接地 如图&#xff0c;分别为电压源、电流源和功率源&#xff0c;其中功率源在仿真中经常用到&…

《intel开发手册卷3》读书笔记1

1、CPU工作模式 1&#xff09;实模式&#xff1a;8086的寄存器只有16位&#xff0c;我们也习惯于称8086的工作模式为16位模式。后续的CPU为了保持兼容性&#xff0c;在芯片上了电以后&#xff0c;还必须运行于16位模式之下。这种模式还有个正式的名字叫做实模式。在实模式下&am…

Stable Diffusion WebUI 绘画

配置环境介绍​ 目前平台集成了 Stable Diffusion WebUI 的官方镜像&#xff0c;该镜像中整合如下资源&#xff1a; GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本&#xff1a;v1.7.0 Python版本&#xff1a;3.1…

vue2 报错 component name“Index“should always be multi-word

报错原因&#xff1a; 组件名称应该为俩个或俩个以上单词组成的&#xff0c;并且还要是大驼峰命名&#xff0c;例如&#xff1a;MyIndex&#xff0c;MyLogin等 解决方法一&#xff1a; 将组件名称改为俩个或俩个以上单词组成的名称&#xff0c;且为大驼峰命名&#xff0c;例如…

半小时搞懂STM32面经知识——ADC

1.ADC 1.1 ADC是什么&#xff1f; 将连续变量的模拟信号转换为离散变量的数字信号 1.2 ADC的位数&#xff1f;&#xff08;采样精度&#xff09; F1和F4都具有3个ADC&#xff0c;F1可提供21个输入通道&#xff0c;F4可以提供24个输入通道。 F4的ADC支持12位&#xff0c;10位…

2024最新软件测试面试题及答案【史上最全】

以下是软件测试相关的面试题及答案&#xff0c;欢迎大家参考! 1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&…

SparkSQL概述

1.1. SparkSQL介绍 SparkSQL&#xff0c;就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL&#xff0c;而是叫做Shark。最开始的时候底层代码优化、SQL的解析、执行引擎等等完全基于Hive&#xff0c;总是Shark的执行速度要比…

动手学深度学习18 预测房价竞赛总结

动手学深度学习18 预测房价竞赛总结 李沐老师代码AutoGluonh2o集成学习automlQA 视频&#xff1a; https://www.bilibili.com/video/BV15Q4y1o7vc/?vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 代码&#xff1a; https://www.bilibili.com/video/BV1rh411m7Hb/?vd_sourceeb04…

JAVA系列:IO流

JAVA IO流 IO流图解 一、什么是IO流 I/O流是Java中用于执行输入和输出操作的抽象。它们被设计成类似于流水&#xff0c;可以在程序和外部源&#xff08;如文件、网络套接字、键盘、显示器等&#xff09;之间传输数据。按处理数据单位分为&#xff1a; 1字符 2字节 、 1字节(…

Linux修炼之路之权限

目录 引言 一&#xff1a;Linux中用户的分类 二&#xff1a;在Linux中的权限 1.权限的两种属性 1.人的属性 2.事物属性 -主要以文件属性为主 3.文件权限值的两种表示方式方法 2.更改文件访问者(拥有者&#xff0c;所属组&#xff0c;其他人)权限属性 3.更改文件的拥有…

电子作业指导书系统如何提升医疗设备工厂的生产效率

在医疗设备工厂中&#xff0c;电子作业指导书&#xff08;ESOP&#xff09;正逐渐成为提升生产效率的关键因素。 一、电子作业指导书系统提供了即时可得的准确信息。 电子作业指导书系统与传统的纸质作业指导书相比&#xff0c;员工可以在工作现场通过电子设备随时查阅最新、最…

基于PSO优化的PV光伏发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于PSO优化的PV光伏发电系统simulink建模与仿真。其中PSO采用matlab编程实现&#xff0c;通过simulink的函数嵌入模块&#xff0c;将matlab调用进simulink中。 2.系统仿真结…

【Linux系统化学习】守护进程 | 序列化和反序列化

目录 前言 守护进程 会话 进程组 setsid系统调用 守护进程系统调用 再谈协议 序列化和反序列化 Json 前言 上两篇文章我们所编写的服务器&#xff0c;并算不上真正意义上的服务器一般的服务器都是要随时能够访问的&#xff0c;就像我们在任何时间段都可以打开抖音获取…

[C++核心编程-09]----C++类和对象之继承

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

【MQTT】paho.mqtt.cpp 库的 介绍、下载、交叉编译、MQTT客户端例子源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-05-13 1…

实习大学生如何在Purple Pi OH鸿蒙开发板下调试Android串口?

本文适用于Purple Pi OH在Android固件后串口的开发与使用。触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大降低了开源鸿蒙开发者的入门门槛&#xff0c…

Ubuntu系统搭建Tipask开源问答系统并发布公网分享好友远程访问

文章目录 1. 前言2.Tipask网站搭建2.1 Tipask网站下载和安装2.2 Tipask网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4. 公网访问测试5. 结语…

神经网络复习--数学相关基础知识

文章目录 矩阵范数卷积激活函数信息熵 矩阵 标量&#xff1a;一个标量就是一个单独的数向量&#xff1a;一个向量是一列数。这些数是有序排列的。通过次序中的索引&#xff0c;我们可以确定每个单独的数矩阵&#xff1a;矩阵是一个二维数组&#xff0c;其中的每个元素被两个索…