【C语言】文件的操作与文件函数的使用(详细讲解)
前言:我们在学习C语言的时候会发现在编写一个程序的时候,数据是存在内存当中的,而当我们退出这个程序的时候会发现这个数据不复存在了,因此我们可以通过文件把数据记录下来,使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:C程序设计谭浩强版本 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
目录
- 什么是文件
- 程序文件
- 数据文件
- 文件名
- 文件的打开和关闭
- 文件指针
- 文件的打开和关闭
- 文件的打开(fopen函数)
- 文件的关闭(fclose函数)
- 关于文件的使用方式
- 文件的顺序读写
- 什么是输入流和输出流、标准错误流?
- 文件函数的用法
- fgetc函数
- fputc函数
- fgets函数
- fputs函数
- fscanf函数
- fprintf函数
- fread函数
- fwrite函数
- fseek函数
- ftell函数
- rewind函数
- feof函数
- ferror函数
- 文本文件和二进制文件
- 文件缓冲区
什么是文件
磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如:
为了方便起见,文件标识常被称为文件名。
文件的打开和关闭
文件指针
缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
下面我们一起来创建一个文件指针变量:
FILE* pf;//文件指针变量
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。如下图所示:
代码实例:
int main()
{FILE* pf = fopen("text.txt", "w");//打开一个文件,以写的形式if (pf == NULL){perror("fopen");return 1;}//写文件char ch = 0;fputc('a', pf);//写入字符a到文件中fclose(pf);pf = NULL;return 0;
}
运行结果:
我们注意此时的光标是指向的字符a,也就是文件指针是指向了a的位置,且随着你追加的字符,文件指针的位置也会随着改变。
文件的打开和关闭
-
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
-
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
-
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。
文件的打开(fopen函数)
fopen函数用来打开一个文件,具体如何使用我们看下图:
具体代码演示:
//以写的形式打开一个名称为:test的文本
FILE* pf = fopen("test.txt", "w");
文件的关闭(fclose函数)
fclose函数,用来关闭打开的文件。具体用法如下
具体代码演示:
FILE* pf = fopen("test.txt", "w");
fclose(pf);//关闭打开的文件
关于文件的使用方式
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 为了输入数据,打开一个已经存在的文本文件 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建立一个文本文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写)) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新文件 |
实例代码演示:
int main()
{//打开文件FILE* pFile = fopen("myfile.txt", "w");//文件操作if (pFile != NULL)//判断文件是否打开失败,fopen函数打开失败会返回NULL{fputs("fopen example", pFile);//写入信息(输出流)//关闭文件fclose(pFile);//关闭文件pFile = NULL;//置为空指针,防止野指针}return 0;
}
运行结果:
注:在你对应的程序的文件夹下面会生成此文件,并如下图所示
文件的顺序读写
功能 | 函数名 | 适用于 |
---|---|---|
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
什么是输入流和输出流、标准错误流?
-
输出流(stdout):简单的理解就是你把你C语言所写的程序,传递给了某个文件就是输出流。如下图:
-
输入流(stdin):你用这C语言程序读取文件,就是输入流,如上图所示。
-
标准错误流(stderr)
文件函数的用法
fgetc函数
fgetc字符输入函数,可以通俗的理解从文件中读取字符信息
来看代码实例演示:
我们先创建一个text的文本,在里面放入如下图所示的信息:
我们来编写一个程序来读取该文本中的信息
int main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL)//判断是打开文件失败{perror("fopen");return 1;}//读文件int ch = fgetc(pf);//将读取到的字符保存在ch中printf("%c ", ch);//打印读取的字符ch = fgetc(pf);printf("%c ", ch);ch = fgetc(pf);printf("%c ", ch);ch = fgetc(pf);printf("%c ", ch);ch = fgetc(pf);printf("%c ", ch);fclose(pf);pf = NULL;return 0;
}
运行结果:
fputc函数
fputc字符输出函数,可以通俗的理解成在C语言程序输出字符到文件中去。
代码实例演示:
//读写文件
int main()
{FILE* pf = fopen("weiwei.txt", "w");//以写的形式打开文件if (pf == NULL)//判断打开是否成共{perror("fopen");//找出错误原因return 1;}//写文件char ch = 0;for (ch = 'a'; ch <= 'z'; ch++){if (ch % 5 == 0){fputc('\n', pf);//每个五的倍数的ASCII值换行一次}fputc(ch, pf);//把ch中的字符写入文件指针pf中}fclose(pf);//关闭文件pf = NULL;return 0;
}
运行结果:
fgets函数
fgetc函数文本行输出函数,通俗的理解从文件中读取行数据
代码实例演示:
int main()
{char mystring[100] = { 0 };//创建一个字符数组用来存放读取的数据FILE* pFile = fopen("myfile.txt", "r");//以读的形式打开文件if (pFile == NULL) //判断是否打开成功perror("Error opening file");else {if (fgets(mystring, 20, pFile) != NULL)//读取20个字符数据(20个字节,一个汉字是两个字节)puts(mystring);//输出字符数组fclose(pFile);//关闭文件pFile = NULL;//置为空指针}return 0;
}
文本中的数据:
运行结果:
fputs函数
fputc函数,可以通俗的理解成将数组中的字符串写入文件中。
代码实例演示:
int main()
{char sentence[256] = { 0 };printf("请追加一个句子: ");fgets(sentence, 256, stdin);//将输入流中(即文件中)数据放在字符数组中FILE* pFile = fopen("zhouzhou.txt", "a");fputs(sentence, pFile);//将字符数组中的数据写入文件当中fclose(pFile);return 0;
}
运行结果:
fscanf函数
fscanf函数,可以通俗的理解成以格式化的形式读取文件中的数据
代码示例演示:
int main()
{char str[80];float f;FILE* pFile = fopen("mywei.txt", "w+");//以读和写的形式打开一个文件fprintf(pFile, "%f %s", 3.1416, "PI");//把该数据格式化写入到文件中去rewind(pFile);//将指针初始化fscanf(pFile, "%f", &f);//格式化读取文件中的数据fscanf(pFile, "%s", str);//同理fclose(pFile);//关闭文件pFile = NULL;printf("I have read: %f and %s \n", f, str);return 0;
}
运行结果:
fprintf函数
fprintf函数,可以通俗的理解成从C语言程序中格式化的写入数据到文件去。
代码实例演示:
int main()
{int n;char name[100];FILE* pFile = fopen("myfile.txt", "w");for (n = 0; n < 3; n++){puts("please, enter a name: ");gets(name);//读取字符fprintf(pFile, "Name %d [%-10.10s]\n", n + 1, name);//格式化写入数据到文件中}fclose(pFile);return 0;
}
运行结果:
fread函数
fread函数,可以通俗的理解成用二进制的形式读取文件
代码实例演示:
int main()
{int arr[10] = { 1222,1222,33,19,5,6,7,8,9,10 };//int arr[10] = {0};FILE* pf = fopen("wwwagou.bin", "wb");//读写if (pf == NULL){perror("fopen");return 1;}//二进制的写文件fwrite(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);//二进制的读文件fread(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}fclose(pf);pf = NULL;return 0;
}
运行结果:
fwrite函数
fwrite函数,可以通俗的理解成用二进制的形式写入数据到文件中。
代码实例演示:
int main()
{char buffer[] = { 'x' , 'y' , 'z' };FILE* pFile = fopen("myfile.bin", "wb");//以二进制的形式写入fwrite(buffer, sizeof(char), sizeof(buffer), pFile);//写入数据fclose(pFile);return 0;
}
运行结果:
在记事本中打开会发现我们可以看懂这个代码
假若修改一下:
int main()
{int buffer[] = {1,2,3};FILE* pFile = fopen("myfile.bin", "wb");//以二进制的形式写入fwrite(buffer, sizeof(int), sizeof(buffer), pFile);//写入数据fclose(pFile);return 0;
}
我们此时会发现在记事本中是一串乱码,因此我们要在Vscode中去读取
fseek函数
feek函数,可以理解成根据文件指针的位置和偏移量来定位文件指针,也就是随机在哪里读写数据。
代码实例演示
int main()
{FILE* pFile = fopen("example.txt", "wb");if (pFile == NULL){perror("fopen");return 1;}fputs("This is an apple.", pFile);//写入数据到文件中fseek(pFile, 9, SEEK_SET);//调整光标(指针为起始位置往后第九个的位置)fputs(" sam", pFile);//从光标(指针指向第九个字符的位置)追加新的数据fclose(pFile);//关闭文件pFile = NULL;return 0;
}
运行结果:
ftell函数
ftell函数,通俗的讲就是返回当前位置的光标距离起始位置的距离的值
代码实例演示:
int main()
{long size;FILE* pFile = fopen("myfile.txt", "rb");//读写一个二进制文件if (pFile == NULL) perror("Error opening file");else{fseek(pFile, 0, SEEK_END); // non-portablesize = ftell(pFile);//计算举例起始位置的距离fclose(pFile);printf("Size of myfile.txt: %1d bytes.\n", size);}return 0;
}
文件中原本的样子:
运行结果:
rewind函数
rewind函数,让文件指针的位置回到文件的起始位置
代码实例演示:
int main()
{int n;FILE* pFile;char buffer[27];pFile = fopen("myfile1.txt", "w+");for (n = 'A'; n <= 'Z'; n++)fputc(n, pFile);//将数据写入文件rewind(pFile);//回到起始位置fread(buffer, 1, 26, pFile);//读取fclose(pFile);buffer[26] = '\0';puts(buffer);//输出数据return 0;
}
运行结果:
feof函数
feof函数,在文件读取结束后,用来判断文件是否遇到文件末尾而结束
代码实例演示:
int main()
{FILE* pFile;int n = 0;pFile = fopen("myfile.txt", "rb");//读写的形式打开文件if (pFile == NULL) perror("Error opening file");else{while (fgetc(pFile) != EOF)//读取里面的数据 {++n;//判断有几个bytes}if (feof(pFile))//判断是否正常结束{puts("End-of-File reached.");//正常结束printf("Total number of bytes read: %d\n", n);//计算总字节数}else puts("End-of-File was not reached.");fclose(pFile);}return 0;
}
记事本中的数据:
运行结果:
ferror函数
ferror函数,用来判断在文件读取结束后,用来判断文件是否因为读取过程当中遇到错误而结束!
代码实例演示:
int main()
{FILE* pFile;pFile = fopen("myfile.txt", "r");if (pFile == NULL) perror("Error opening file");else {fputc('x', pFile);//写入数据if (ferror(pFile))//判断在读取的过程中的错误printf("Error Writing to myfile.txt\n");perror("pFile");//判断错误原因fclose(pFile);//因为是以读的形式,所以失败}return 0;
}
运行结果:
文本文件和二进制文件
- 根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
- 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
- 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
- 一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 - 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。
文件缓冲区
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题。
结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。
相关文章:

【C语言】文件的操作与文件函数的使用(详细讲解)
前言:我们在学习C语言的时候会发现在编写一个程序的时候,数据是存在内存当中的,而当我们退出这个程序的时候会发现这个数据不复存在了,因此我们可以通过文件把数据记录下来,使用文件我们可以将数据直接存放在电脑的硬盘…...

ROS-PX4仿真笔记_1
offbord模式测试 rosrun offboard_pkg position stablelize模式 lqr控制器实验 roslaunch px4 fast_test.launch 无人机起飞1.5-2m sh mybot_gazebo.sh#roslaunch px4 fast_racing.launch & sleep 20; roslaunch ego_planner single_run_in_gazebo.launch & sleep 1…...

使用 Python 中的小波变换信号驾驭股票价格的波动
一、简介 股票上涨和下跌,创造出像海浪一样难以预测的模式和走势。然而,就像科学家通过了解下面的水流来预测波浪的运动一样,我们也可以使用类似的工具破译股票市场的一些模式。 通过利用小波变换的力量,我们深入表面,试图揭示驱动股价的深层原因。这段旅程不仅仅涉及数字…...

AndroidStudio模拟器,没有Google Play的就有ROOT权限
正确选择版本 测试 D:\>adb shell emulator64_x86_64:/ $ su emulator64_x86_64:/ #...

复选框 前端代码
表单中复选框选项 <el-form-item label="是否公开:" hidden="true"><input type="checkbox...

每日一练 | 网络工程师软考真题Day41
1、包过滤防火墙对通过防火墙的数据包进行检查,只有满足条件的数据包才能通过,对数据包的检查内容一般不包括 。 A.源地址 B.目的地址 C.协议 D.有效载荷 2、下面关于ARP木马的描述中,错误的…...

vue使用pinia存储数据并保持数据持久化
在Vue中使用Pinia存储数据并保持数据持久化,你可以遵循以下步骤: 安装Pinia:首先,你需要安装Pinia。可以通过npm或yarn来安装它。在终端中运行以下命令: npm install pinia# 或者使用yarn yarn add pinia创建Pinia St…...

k8s - Flannel
1.Flannel概念剖析 Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。这次的分享内容将从Flannel的介绍、工作原理及安装和配置三方…...

服务器中了balckhoues勒索病毒怎么办?勒索病毒解密,数据恢复
近日,云天数据恢复中心发现,有多位用户的服务器中了一种名为balckhoues的勒索病毒,因为绝大多数用户是第一次遇到这种情况,所以对这种类型的勒索病毒并不是很了解。那接下来我们将对balckhoues勒索病毒做一个分析。 中毒特征 服务…...

react-pdf | Warning: TextLayer styles not found.
问题描述: 使用react-pdf展示pdf,但是报警告,Warning: TextLayer styles not found. 解决方法: <Pageloading{"加载中..."}renderAnnotationLayer{false}renderTextLayer{false}/> 添加属性如上,设…...

vue上传文件MD5加密
1.下载MD5依赖 npm install crypto-js 2.在utils文件夹中新增文件md5方法文件,文件名自定义(fileMd5Sum.js) import CryptoJs from crypto-js export default {// md5值计算fileMd5Sum(file) {let CryptoJS require("crypto-js"…...

vue2 .sync 修饰符
vue2 .sync 修饰符 **创建 工程: H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day04\准备代码\13-sync修饰符 vue --version vue create v-sy…...

使用Tensorrt的一般步骤
使用Tensorrt的一般步骤 TensorRT的使用包括两个阶段:build and deployment。 build:该阶段主要完成模型转换(从caffe或TensorFlow到TensorRT),如下图所示,在模型转换时会完成前述优化过程中的层间融合&am…...

uniapp apple 苹果登录 离线本地打包
官方文档 uni-app官网 文档写的不全,没有写离线打包流程 加lib 签名里带 sign in with apple hbuilder开关 代码 测试代码,获取app里所有的provider uni.getProvider({service: oauth,success: function (res) {console.log(res.provider)uni.showT…...

【数据库】Sql Server数据迁移,处理自增字段赋值
给自己一个目标,然后坚持一段时间,总会有收获和感悟! 在实际项目开发中,如果遇到高版本导入到低版本,或者低版本转高版本,那么就会出现版本不兼容无法导入,此时通过程序遍历创建表和添加数据方式…...

JOSEF约瑟 矿用一般型选择性漏电继电器 LXY2-660 Φ45 JKY1-660
系列型号: JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB JJB-380;JJB-380/660 JD-12…...

DHCP自动分配IP原理
DHCP自动分配IP原理 1.采用UDP通信方式 2.服务器IP:255.255.255.255; 服务器端口:67, 设备接收端口:68 3.设备向服务器发送DISCOVER信息 4.设备收到服务器回应,且解析正确 5.设备向服务器发送REQUEST请求消息 6.设备接…...

读书笔记-《ON JAVA 中文版》-摘要26[第二十三章 注解]
文章目录 第二十三章 注解1. 基本语法1.1 基本语法1.2 定义注解1.3 元注解 2. 编写注解处理器2.1 编写注解处理器2.2 注解元素2.3 默认值限制 3. 使用javac处理注解4. 基于注解的单元测试5. 本章小结 第二十三章 注解 注解(也被称为元数据)为我们在代码…...

IDEA报Error:java:无效的源发行版13解决方式
出现问题原因:原本项目是spingboot2.0版本开发的,IDEA启动正常,后期新项目使用spingboot3.0,通过原来的IDEA版本及JDK1.8启动报上述错误,以下为版本文件 解决方式: 项目背景:项目已经上线&…...

基于SpringBoot的健身房管理系统
目录 前言 一、技术栈 二、系统功能介绍 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步…...

竞赛选题 深度学习 植物识别算法系统
文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核,池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…...

希尔贝壳受邀参加《人工智能开发平台通用能力要求 第4部分:大模型技术要求》标准第一次研讨会
随着大模型技术与经验的不断累积,该方向也逐渐从聚焦技术突破,到关注开发、部署、应用的全流程工程化落地。为完善人工智能平台标准体系建设,满足产业多样化需求,2023年9月7日,中国信通院云大所在线上召开《人工智能开…...

虹科方案 | AR助力仓储物流突破困境:规模化运营与成本节约
文章来源:虹科数字化AR 点击阅读原文:https://mp.weixin.qq.com/s/xis_I5orLb6RjgSokEhEOA 虹科方案一览 HongKe DigitalizationAR 当今的客户体验要求企业在人员、流程和产品之间实现全面的连接。为了提升整个组织的效率并提高盈利能力,物流…...

spring容器ioc和di
spring ioc 容器的创建 BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象,它是SpringIoC容器标准化超接口! ApplicationContext 是 BeanFactory 的子接口。它扩展了以下功能: 更容易与 Spring 的 AOP 功能集成消…...

Maven 仓库地址
一、Maven 中央仓库地址 http://www.sonatype.org/nexus/http://mvnrepository.com/ (本人推荐仓库)http://repo1.maven.org/maven2 二、Maven 中央仓库地址大全 1、阿里中央仓库(首选推荐) <repository> <id>al…...

【2023研电赛】安谋科技企业命题特别奖:面向独居老人的智能居家监护系统
本文为2023年第十八届中国研究生电子设计竞赛安谋科技企业命题特别奖分享,参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力,更有丰富电子礼品等你来领!,分享2023研电赛作品扩大影响力,更有丰富电子礼品等你来…...

[Machine learning][Part4] 多维矩阵下的梯度下降线性预测模型的实现
目录 模型初始化信息: 模型实现: 多变量损失函数: 多变量梯度下降实现: 多变量梯度实现: 多变量梯度下降实现: 之前部分实现的梯度下降线性预测模型中的training example只有一个特征属性:…...

LCR 078. 合并 K 个升序链表
LCR 078. 合并 K 个升序链表 题目链接:LCR 078. 合并 K 个升序链表 代码如下: class Solution { public:ListNode* mergeKLists(vector<ListNode*>& lists) {ListNode *lsnullptr;for(int i0;i<lists.size();i){lsmergeList(ls,lists[i])…...

JVM面试题:(三)GC和垃圾回收算法
GC: 垃圾回收算法: GC最基础的算法有三种: 标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般 都采用分代收集算法。 标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的…...

hive建表指定列分隔符为多字符分隔符实战(默认只支持单字符)
1、背景: 后端日志采集完成,清洗入hive表的过程中,发现字段之间的单一字符的分割符号已经不能满足列分割需求,因为字段值本身可能包含分隔符。所以列分隔符使用多个字符列分隔符迫在眉睫。 hive在建表时,通常使用ROW …...