【C语言基础】:文件操作详解(后篇)

文章目录

      • 一、文件的顺序读写
        • 1.1 顺序函数读写函数介绍
        • 1.2 fgetc函数和fputc函数
        • 1.3 fputs函数和fgets函数
        • 1.4 fprintf函数和fscanf函数
        • 1.5 fwrite函数和fread函数
      • 二、文件的随机读写
        • 2.1 fseek函数
        • 2.2 ftell函数
        • 2.3 rewind函数
      • 三、文件读取结束的判定
        • 3.1 feof函数
      • 四、文件缓冲区

上期回顾: 【C语言基础】:文件操作详解(前篇:准备知识)

一、文件的顺序读写

1.1 顺序函数读写函数介绍

在这里插入图片描述

1.2 fgetc函数和fputc函数

fputc函数原型

int fputc ( int character, FILE * stream );

将字符写入流
将一个字符写入流并推进位置指示器。
字符被写入流的内部位置指示器所指示的位置,然后自动向前移动一个。

参数说明

character: 要写入的字符,以整数形式表示。
stream :指向要写入的文件的文件指针。

函数返回值

如果成功写入字符,则返回写入的字符,如果发生错误,则返回 EOF。

【示例1】

#include<stdio.h>
int main()
{// 打开文件FILE* pf = fopen("test1.txt", "w");if (pf == NULL){perror("fopen");return 1;}// 写文件fputc('a', pf);fputc('b', pf);fputc('c', pf);// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述
【示例2】

#include<stdio.h>
int main()
{// 打开文件FILE* pf = fopen("test1.txt", "w");if (pf == NULL){perror("fopen");return 1;}// 写文件char ch = 0;for (ch = 'A'; ch <= 'Z'; ch++){fputc(ch, pf);}// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述

fgetc函数原型

int fgetc ( FILE * stream );

从流中获取字符
返回指定流的内部文件位置指示符当前指向的字符。然后将内部文件位置指示符推进到下一个字符。
如果流在被调用时位于文件的末尾,则该函数返回EOF并为流设置文件结束指示器(feof)。
如果发生读错误,该函数返回EOF并设置流的错误指示器(error)。
fgetc和fgetc是等价的,除了getc可以在某些库中作为宏实现。

参数说明

stream: 指向要读取的文件的文件指针。

函数返回值

如果成功读取一个字符,则返回读取的字符,如果已到达文件末尾或发生错误,则返回 EOF。
返回值是整形的原因

  1. 读取成功,返回该字符的ASCII值。
  2. 读到文件末尾或则读取失败,返回EOF(-1)。

【示例1】

#include<stdio.h>
int main()
{// 打开文件FILE* pf = fopen("test1.txt", "r");if (pf == NULL){perror("fopen");return 1;}// 读文件int ch = fgetc(pf);printf("%c", ch);ch = fgetc(pf);printf("%c", ch);ch = fgetc(pf);printf("%c", ch);// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
【示例2】

#include<stdio.h>
int main()
{// 打开文件FILE* pf = fopen("test1.txt", "r");if (pf == NULL){perror("fopen");return 1;}// 读文件char ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c", ch);}// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

1.3 fputs函数和fgets函数

fputs函数原型

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

将字符串写入流
将由str指向的C字符串写入流。
函数从指定的地址(str)开始复制,直到到达结束的空字符(‘\0’)。这个终止的空字符不会复制到流中。
注意,fputs与puts的不同之处不仅在于可以指定目标流,而且fputs不会写入额外的字符,而puts会自动在末尾附加一个换行符。

参数说明

str: 要写入的字符串,以 const char * 类型表示。
stream: 指向要写入的文件的文件指针。

函数返回值

如果成功写入字符串,则返回非负值(通常为 0),如果发生错误,则返回 EOF。

【示例】

#include<stdio.h>
int main()
{// 打开文件FILE* pf = fopen("test1.txt", "w");if (pf == NULL){perror("fopen");return 1;}// 写文件fputs("hello", pf);fputs(" world", pf);// 关闭文件fclose(pf);pf = NULL;return 0;
}

fgets函数原型

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

从流中获取字符串
从流中读取字符,并将其作为C字符串存储到str中,直到读取(num-1)个字符,或者到达换行符或文件结束符,以先发生的为准。
换行符使fgets停止读取,但它被函数认为是一个有效字符,并包含在复制到str的字符串中。
在复制到str的字符之后,将自动追加一个终止null字符。
请注意,fgets与gets有很大的不同:fgets不仅接受流参数,而且允许指定str的最大长度,并在字符串中包含任何结束换行符。
参数说明

str: 一个指向字符数组的指针,用于存储读取的字符。
num: 要读取的最大字符数(包括空字符),通常是 str 缓冲区的大小。
stream: 指向要读取的文件的文件指针。

函数返回值

如果成功读取一行字符,则返回 str 参数的值;如果到达文件末尾或发生错误,则返回 NULL。

【示例】

#include<stdio.h>
int main()
{// 打开文件FILE* pf = fopen("test1.txt", "r");if (pf == NULL){perror("fopen");return 1;}// 读文件char arr[10] = { 0 };fgets(arr, 10, pf);printf("%s\n", arr);// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述
注意:要求读10个字符,结果却只读9个,因为\0也会算进去。

1.4 fprintf函数和fscanf函数

fprintf函数原型

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

将格式化的数据写入流
将由format指向的C字符串写入流。如果format包含格式说明符(以%开头的子序列),则格式化format之后的其他参数并将其插入到结果字符串中,以替换它们各自的说明符。
在format形参之后,函数期望至少与format指定的一样多的附加参数。

参数说明如下

stream:指向文件的指针,它指定了数据将要被写入的文件。
format:一个格式化字符串,其中包含了要写入的数据以及格式化说明符。
:可变数量的参数,根据 format 字符串中的格式化说明符指定了要写入的数据。
fprintf 函数的返回值是一个 int 类型,表示成功写入的字符数,如果发生错误则返回一个负数。

【示例】

#include<stdio.h>
struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "张三", 19, 89.5 };// 打开文件FILE* pf = fopen("test1.txt", "w");if (pf == NULL){perror("fopen");return 1;}// 写文件fprintf(pf, "%s %d %f", s.name, s.age, s.score);// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述
fscanf函数原型

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

从流中读取格式化的数据
从流中读取数据,并根据参数格式将其存储到附加参数所指向的位置。
额外的参数应该指向已经分配的对象,其类型由格式字符串中相应的格式说明符指定。

参数说明如下

stream:指向文件的指针,它指定了从中读取数据的文件。
format:一个格式化字符串,其中包含了要读取的数据的格式化说明符。
:可变数量的参数,根据 format 字符串中的格式化说明符指定了要读取的数据。
fscanf 函数的返回值是一个 int 类型,表示成功读取并匹配的数据项的数量。如果到达文件结束或发生读取错误,则返回 EOF (-1)。

【示例】

#include<stdio.h>
struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "张三", 19, 89.5f };// 打开文件FILE* pf = fopen("test1.txt", "r");if (pf == NULL){perror("fopen");return 1;}// 读文件fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));// 打印到屏幕上printf("%s %d %f\n", s.name, s.age, s.score);// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

1.5 fwrite函数和fread函数

fwrite函数原型

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

将数据块写入流
将由count元素组成的数组(每个元素的大小为size字节)从ptr所指向的内存块写入流中的当前位置。
流的位置指示器按写入的总字节数前进。
在内部,该函数将ptr指向的块解释为unsigned char类型的(size*count)元素数组,并将它们顺序写入流,就像对每个字节调用fputc一样。

参数说明如下

ptr:指向要写入的数据块的指针。
size:每个数据项的大小(以字节为单位)。
count:要写入的数据项的数量。
stream:指向文件的指针,它指定了数据将要被写入的文件。
fwrite 函数的返回值是一个 size_t 类型,表示成功写入的数据项的数量。如果发生错误,则返回一个小于 count 的值。

【示例】

#include<stdio.h>
int main()
{int arr[] = { 1,2,3,4,5 };// 打开文件FILE* pf = fopen("test1.txt", "wb");if (pf == NULL){perror("fopen");return 1;}// 写文件int sz = sizeof(arr) / sizeof(arr[0]);fwrite(arr, sizeof(arr[0]), sz, pf);  // 以二进制的形式写入 // 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述
fread函数原型

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

从流中读取数据块
从流中读取一个由count元素组成的数组,每个元素的大小为size字节,并将它们存储在ptr指定的内存块中。
流的位置指示器按读取的总字节数前进。
如果成功读取的总字节数为(size*count)。

参数说明如下

ptr:指向存储读取数据的缓冲区的指针。
size:每个数据项的大小(以字节为单位)。
count:要读取的数据项的数量。
stream:指向文件的指针,它指定了从中读取数据的文件。
fread 函数的返回值是一个 size_t 类型,表示成功读取的数据项的数量。如果到达文件末尾或发生读取错误,则返回一个小于 count 的值。

【示例】

#include<stdio.h>
int main()
{int arr[5] = { 0 };// 打开文件FILE* pf = fopen("test1.txt", "rb");if (pf == NULL){perror("fopen");return 1;}// 读文件fread(arr, sizeof(arr[0]), 5, pf);for (int i = 0; i < 5; i++){printf("%d ", arr[i]);}// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)

二、文件的随机读写

2.1 fseek函数

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。
函数原型

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

重新定位流位置指示器
将与流关联的位置指示器设置为新位置。
对于以二进制模式打开的流,通过将偏移量添加到由origin指定的参考位置来定义新位置。
对于以文本模式打开的流,offset值要么为零,要么为先前调用ftell返回的值,origin必须为SEEK_SET。
如果使用这些参数的其他值调用函数,则支持取决于特定的系统和库实现(不可移植)。
在成功调用此函数后,流的文件结束内部指示符将被清除,并且先前调用ungetc对该流的所有效果将被删除。
在为update(读+写)打开的流上,调用fseek允许在读和写之间切换。

参数说明如下

stream:指向文件的指针,它指定了要设置位置指针的文件。
offset:相对于 origin 的偏移量。偏移量可以是正数(向文件末尾方向移动)或负数(向文件开头方向移动)。
origin:指定了从哪个位置计算偏移量的基准。可以取以下三个值之一:

  • SEEK_SET:从文件开头计算偏移量。
  • SEEK_CUR:从当前位置计算偏移量。
  • SEEK_END:从文件末尾计算偏移量。

fseek 函数的返回值是一个 int 类型,表示操作是否成功。如果成功,返回0;如果出现错误,返回非零值。通过 ferror 函数可以检查是否发生了错误。

【示例】

#include<stdio.h>
int main()
{// 打开文件FILE* pf = fopen("test1.txt", "r");if (pf == NULL){perror("fopen");return 1;}// 读文件int ch = fgetc(pf);printf("%c\n", ch);// fseek(pf, 5, SEEK_SET);// f// fseek(pf, 4, SEEK_CUR);// ffseek(pf, -4, SEEK_END);// fch = fgetc(pf);printf("%c\n", ch);// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述

2.2 ftell函数

返回文件指针相对于起始位置的偏移量
函数原型

long int ftell ( FILE * stream );

获取流中的当前位置
返回流的位置指示器的当前值。
对于二进制流,这是从文件开头开始的字节数。
对于文本流,数值可能没有意义,但仍然可以用于稍后使用fseek将位置恢复到相同的位置(如果使用ungetc放回的字符仍然等待读取,则行为未定义)。

参数说明如下

stream:指向文件的指针,它指定了要获取位置指针的文件。
ftell 函数的返回值是一个 long int 类型,表示当前位置指针相对于文件开头的偏移量(以字节为单位)。如果出现错误,返回值可能是 -1。通常情况下,返回值应该是非负数,但标准并未规定返回值的确切含义,因此应谨慎处理。

【示例】

#include<stdio.h>
int main()
{// 打开文件FILE* pf = fopen("test1.txt", "r");if (pf == NULL){perror("fopen");return 1;}// 读文件int ch = fgetc(pf);printf("%c\n", ch);// afseek(pf, -4, SEEK_END);// fprintf("%d\n", ftell(pf));// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

2.3 rewind函数

让文件指针的位置回到文件的起始位置
函数原型

void rewind ( FILE * stream );

设置流的起始位置
将与流关联的位置指示器设置为文件的开头。
在成功调用此函数后,与流相关的文件结束和错误内部指示器将被清除,并且先前调用ungetc对该流的所有效果将被删除。
在为更新(读+写)打开的流上,对rewind的调用允许在读和写之间切换。

参数说明如下

stream:指向文件的指针,它指定了要重置位置指针的文件。
rewind 函数没有返回值。它会将文件流的位置指针设置为文件开头,以便重新读取文件内容或进行其他操作。使用 rewind 函数后,可以再次从文件开头开始读取数据。

【示例】

#include<stdio.h>
int main()
{// 打开文件FILE* pf = fopen("test1.txt", "r");if (pf == NULL){perror("fopen");return 1;}// 读文件int ch = fgetc(pf);printf("%c\n", ch);// afseek(pf, -4, SEEK_END);ch = fgetc(pf);printf("%c\n", ch);// frewind(pf);ch = fgetc(pf);printf("%c\n", ch);// a// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

三、文件读取结束的判定

3.1 feof函数

函数原型

int feof ( FILE * stream );

当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。
【示例】

#include<stdio.h>
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\n", ch);}// 导致读取结束的原因if (feof(pf)){printf("遇到文件末尾,正常结束");}else if (ferror(pf)){perror("fgetc");}// 关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

四、文件缓冲区

ANSIC 标准采用“缓冲文件系统” 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟⼀块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
在这里插入图片描述
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2vun1hwpzn40o

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决idea种maven依赖时明明有包,但是一直提示 Cannot resolve com.grandtech:gny-common:0.0.7

1、先看提示问题 &#xff0c;Cannot resolve com.grandtech:gny-common:0.0.7&#xff0c; 2、依赖我也是是没有问题 3、在maven库中的包也是要来的新的别人能运行的。但是放进去就是无法解析。 解决办法&#xff1a;在idea中直接&#xff0c;用mvn命令装载&#xff1a; ①…

蓝色系UX/UI设计求职面试作品集模版figmasketchPPT可编辑源文件

页面数量: 20P 页面尺寸:1920*1080PX 交付格式&#xff1a;figma、sketch、PPT 赠送文件&#xff1a;24款高质量样机&#xff08;PSD格式&#xff09; 该作品集虽然只有20页&#xff0c;但可根据需求复制作品集里已有的页面作为模版来扩展您的设计项目 该作品集模版可编辑可修…

【日常记录】【JS】styled-components库的原理,模板字符串调用函数

文章目录 1、引言2、模板字符串调用函数3、实现 1、引言 在react 中&#xff0c;styled-components 是最流行的 css in js 模式的库 2、模板字符串调用函数 let stu {name: 呆呆狗,age: 30,address: 中国}let str fn你好${stu.name}今年${stu.age}岁,来自${stu.address}这样会…

极狐GitLab对接OAuth2实现SSO

本文作者&#xff1a;极狐(GitLab) 高级解决方案架构师 武让 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 企…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅱ)搜索及数据获取配置项

搜索及数据获取配置项 搜索及数据获取配置项属性&#xff1a; noSearchModel&#xff08;无表单搜索标识&#xff09;属性&#xff1a;changeToSearch&#xff08;表单change事件是否触发搜索 &#xff09;属性&#xff1a; changeParams&#xff08;参数预处理【可异步】 &…

微信小程序button按钮怎么去掉边框

项目场景&#xff1a; 在微信小程序里写入button标签之后会有一个默认的黑色细小的边框&#xff0c;给他加了 border: none&#xff1b;也不行 代码&#xff1a; <button class"kef" open-type"contact" bindcontact"handleContact">&l…

Windows Edge 兼容性问题修复:提升用户体验的关键步骤

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Python零基础从小白打怪升级中~~~~~~~FaskAPI中的请求和响应

第二节&#xff1a;FastAPI中请求数据 一、URL请求参数 url请求参数是通过url请求地址携带的&#xff0c;例如&#xff0c;在以下 url 中&#xff1a; http://127.0.0.1:8000/items/?skip0&limit10这些请求参数是键值对的集合&#xff0c;这些键值对位于 URL 的 &#…

19(20)-1(3)-CSS3 平面 2D 变换+CSS3 过渡

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍一、CSS3 平面 2D 变换&#x1f48e;1 坐标轴&#x1f48e;2 transform 语法…

HarmonyOS实战开发-WebSocket的使用。

介绍 本示例展示了WebSocket的使用&#xff0c;包括客户端与服务端的连接和断开以及客户端数据的接收和发送。 WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接&#xff0c;需要先通过createWebSocket方法创建WebSocket对象&#xff0c;然后通过connect…

NI-LabView的DAQ缺少或丢失的解决办法(亲测有效)

DAQmx在Labview中不显示或缺失 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件解决办法 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件 在打开测量I/O时&#xff0c;见不到 DAQmx&#xff0c;或者在Express中见不到DAQ助手…

Ansys 结构 | 从力学学科体系说起

“力学是研究物质机械运动的科学” 力学有着悠久的历史&#xff0c;最早可追溯到古希腊的阿基米德(约公元前287 - 212)&#xff0c;并且在欧洲文艺复兴运动以后&#xff0c;人们逐步对力和运动之间的关系有了正确的认识。 英国科学家牛顿继承和发展了前人的研究成果&#xff0…

PC-3000 Portable III、PC-3000 Express、PC-3000 UDMA 有哪些区别?

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设…

Oracle 常用命令总结

文章目录 一、数据库启动 & 关闭&查看1、启动数据库2、关闭数据库3、连接数据库4、查看数据库名5、查看实例 二、用户1、创建用户2、重置密码3、账户解锁4、账号赋权5、账户撤销权限6、删除用户7、查询所有用户&#xff08;DBA账号执行&#xff09;8、查看当前用户连接…

Unity Shader之数学篇

一、坐标系 1、二维笛卡尔坐标系 屏幕坐标系是二维笛卡尔坐标系&#xff0c;OpenGL的屏幕坐标系原点在左下角&#xff0c;DirectX的屏幕坐标系原点在左上角。 2、三维笛卡尔坐标系 三维笛卡尔坐标系要区分是左手坐标系还是右手坐标系。 左手坐标系&#xff1a;举起你的左手…

蓝桥杯-求阶乘

问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…

平面上最近点对

OJ:P1429 平面最近点对&#xff08;加强版&#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 非常详细的博客&#xff1a;平面上最近点对 - 洛谷专栏 (luogu.com.cn) 更正式的文章&#xff1a;平面最近点对 - OI Wiki 这也是我们算法课的一个实验。不过我做的不好…

计算机网络——38报文完整性

报文完整性 数字签名 数字签名类比于手写签名 发送方数字签署了文件&#xff0c;前提是他是文件的拥有者/创建者可验证性&#xff0c;不可伪造性&#xff0c;不可抵赖性 谁签署&#xff0c;接收方可以向他人证明是他&#xff0c;而不是其他人签署了这个文件签署了什么&#…

【C 数据结构】循环链表

文章目录 【 1. 基本原理 】【 2. 循环链表的创建 】2.1 循环链表结点设计2.2 循环单链表初始化 【 3. 循环链表的 插入 】【 4. 循环单链表的 删除操作 】【 5. 循环单链表的遍历 】【 6. 实例 - 循环链表的 增删查改 】【 7. 双向循环链表 】 【 1. 基本原理 】 对于单链表以…

租个阿里云的服务器多少钱?那可真便宜了

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…