【文件I/O】标准IO:库函数

news/2024/5/14 6:40:19/文章来源:https://blog.csdn.net/weixin_50964793/article/details/128137712

标准IO:库函数

  • 一、基本概念
    • 1.文件类型
    • 2.标准I/O介绍
    • 3.流的概念
    • 4.文本流和二进制流
    • 5.流的缓冲类型
    • 6.标准I/O流(stdin、stdout、stderr)
  • 二、标准I/O函数
    • 1.fopen、fclose、errrno、strerror、perror(打开、关闭文件,输出错误码信息)
    • 2.fgetc、fputc、getchar、putchar(读写一个字符)
    • 3.fgets、fputs、gets、puts(读写一行)
    • 4.fread、fwrite(读写若干个对象)
    • 5.feof、ferror(判断文件是否结束或出错)
    • 6.sprintf、snprintf、fprintf(格式化输出到内存、文件)
    • 7.time、localtime(获取系统时间,将系统时间转为本地时间)
    • 8.fflush(刷新缓冲区)
    • 9.fseek、rewind、ftell(定位文件指针)
    • 10.freopen(重定向输入输出流)
  • 三、示例代码
    • 1.fgetc(统计文本文件字符数)
    • 2.fputc(将a~z写入文件)
    • 3.fgets(标准输入流写入buff)
    • 4.fputs(将内存数据输出到标准输出流)
    • 5.fread、fwrite(二进制文件读写)
    • 6.fflush(刷新流,刷新缓冲区)
    • 7.ftell、fseek、rewind(定位流指针)
    • 8.fprintf、sprintf(格式化输出数据到文件、内存,常用sprintf)
    • 9.fscanf、sscanf(将文件、内存数据格式化输入,可用作解析字符串)
  • 四、案例源码
    • 1.复制文件1
    • 2.统计文本文件行数
    • 3.复制文件2
    • 4.获取文件长度
    • 5.按指定格式打印时间

一、基本概念

1.文件类型

概念:一组相关数据的有序集合
文件类型:

  1. 常规文件 r
  2. 目录文件 d
  3. 字符设备文件 c
  4. 块设备文件 b
  5. 管道文件 p
  6. 套接字文件 s
  7. 符号链接文件 l

2.标准I/O介绍

标志I/O由ANSI C标准定义,主流操作系统上都实现了C库
标准I/O通过缓冲机制减少系统调用,实现更高的效率

3.流的概念

FILE:
标准I/O用一个结构体类型来存放打开的文件的相关信息
标准I/O的所有操作都是围绕FILEl来进行

流(stream):
FILE又被称为流(stream)
文本流/二进制流

4.文本流和二进制流

windows
二进制流:换行符 <—> ‘\n’
文本流:换行符 <—> ‘\r’‘\n’

Liniux
换行符 <—> ‘\n’

5.流的缓冲类型

全缓冲
当流的缓冲区无数据或无空间时才执行实际I/O操作

行缓冲
当输入和输出中遇到换行符(‘\n’)时,进行I/O操作
当流和一个终端关联时,典型的行缓冲

无缓冲
数据直接写入文件,流不进行缓冲

6.标准I/O流(stdin、stdout、stderr)

标准I/O预定义3个流,程序运行时自动打开

标准输入流0STDIN_FILENOstdin
标准输出流1STDOUT_FILENOstdout
标准错误流2STDERR_FILENOstderr

二、标准I/O函数

1.fopen、fclose、errrno、strerror、perror(打开、关闭文件,输出错误码信息)

FILE *fopen(const char *pathname, const char *mode);
功能:打开文件(标准IO)
参数:@pathname:想要打开文件的路径及名字 "./hello.txt" "/home/linux/1.c"@mode:打开文件的方式 "a" "a+" "w" "w+" "r" "r+"r      以只读的方式打开文件,将光标定位到文件的开头r+     以读写的方式打开文件,将光标定位到文件的开头w      以只写方式打开文件,如果文件存在就清空,如果文件不存在就创建,将光标定位到开头w+     以读写方式打开文件,如果文件存在就清空,如果文件不存在就创建,将光标定位到开头a      以追加的方式打开文件,如果文件不存在就创建,如果文件存在不会清空,将光标定位到结尾a+     以读和追加的方式打开文件,如果文件不存在就创建,读光标在开头,写光标在结尾(光标就一个)
返回值:成功返回文件指针,失败返回NULL,置位错误码errno
int fclose(FILE *stream);
功能:关闭文件
参数:@stream:文件指针返回值:成功返回0,失败返回EOF(-1),置位错误码  //#define EOF (-1)
#include <errno.h>
extern int errno;
errno 存放错误码
#include <string.h>
char *strerror(int errnum);
功能:将错误码转换为错误信息
参数:@errnum:错误码
返回值:错误信息的字符串
void perror(const char *s);
功能:打印错误信息
参数:@s:用户的附加信息
返回值:无

2.fgetc、fputc、getchar、putchar(读写一个字符)

int fgetc(FILE *stream);
功能:从文件中读取一个字符(光标自动向后移动)
参数:@stream:文件指针
返回值:成功返回读取到的字符的ASCII,读取到结尾或者遇到错误就返回EOF
int fputc(int c, FILE *stream);
功能:向文件中写入一个字符(光标自动向后移动)
参数:@c:字符的ascii的值 ‘c’ 65@stream:文件指针
返回值:成功返回读取到的字符的ASCII,失败返回EOF
int getchar(void);
getchar()等同于fgetc(stdin)
int putchar(int c);
putchar(c)等同于fputc(ch, stdout)

3.fgets、fputs、gets、puts(读写一行)

char *fgets(char *s, int size, FILE *stream);
功能:从文件中向s指向的内存中读取字符串,最多读size-1个字符(最后一个用于存‘\0’)。fgets遇到EOF或者换行符的时候就会停止,如果遇到换行符停止的,换行符也会被存储到s中。
参数:@s:指向存储字符的首地址@size:想要读取字符的个数@stream:文件指针
返回值:成功返回s,失败返回NULL
int fputs(const char *s, FILE *stream);
功能:将s中的字符串写入到文件中
参数:@s:被写字符串的首地址@steam:文件指针
返回值:成功返回大于0的值,失败返回EOF
char *gets(char *s);
功能:gets从标准输入stdin读字符串到s
返回值:成功返回时s,遇到'\n'或已输入size-1个字符时返回,总是包含'\0',到文件末尾或出错返回NULL
gets不推荐使用,容易造成缓冲区溢出
int puts(const char *s);
功能:puts将缓冲区s中的字符串输出到stdout,并追加'\n'
返回值:成功时返回输出的字符个数,失败返回EOF

4.fread、fwrite(读写若干个对象)

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从stream中读取nmemb项数据,每一项的大小是size,将它们存到ptr
参数:@ptr:存储读取到数据的首地址@size:每一项的大小@nmemb:项目的个数@stream:文件指针
返回值:成功返回读取到的项目的个数,如果小于项目的个数就是错误或者到文件的结尾了。
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:将ptr中的数据写入到stream中,写nmemb向,每一项的大小是size
参数:@ptr:被写数据的首地址@size:每一项的大小@nmemb:项目的个数@stream:文件指针
返回值:成功返回项目的个数,失败返回小于项目的个数。

5.feof、ferror(判断文件是否结束或出错)

fread返回值无法区分是到达了文件的结尾还是错误发生了,调用者必须通过feof或者ferror函数来判断。
int feof(FILE *stream);
功能:判断是否读取到了文件的结尾,如果到了文件的结尾将返回真
参数:@stream:文件指针
返回值:如果到了文件的结尾返回真,如果没有到文件结尾返回假int ferror(FILE *stream);
功能:如果在读文件的时候发生了错误,这个函数返回真
参数:@stream:文件指针
返回值:如果发生了错误返回真,如果没有发生错误返回假

6.sprintf、snprintf、fprintf(格式化输出到内存、文件)

int sprintf(char *str, const char *format, ...);
功能:将format控制格式的内容写到str对应的内存中(不会向终端显示)
参数:@str:内存地址@format:和printf的参数完全相同
返回值:成功返回格式化的字符的个数,失败返回负数
int snprintf(char *str, size_t size, const char *format, ...);
功能:将format控制格式的内容写到str对应的内存中(不会向终端显示)
参数:@str:内存地址@size:最多格式化size个字符,其中还包括一个'\0'@format:和printf的参数完全相同
返回值:成功返回格式化的字符的个数,失败返回负数
int fprintf(FILE *stream, const char *format, ...);
功能:将控制格式格式化的字符串写入到文件中
参数:@stream:文件指针@format:控制格式
返回值:成功返回格式化的字符的个数,失败返回负数

7.time、localtime(获取系统时间,将系统时间转为本地时间)

#include <time.h>
time_t time(time_t *tloc);
功能:获取自1970-01-01 00:00:00到当前的秒钟数
参数:@tloc:NULL
返回值:成功返回秒钟数,失败返回-1,并置位错误码
struct tm *localtime(const time_t *timep);
功能:将time_t的秒钟转换为tm的结构体(结构体中包含年、月、日...)
参数:@timep:秒钟变量的地址
返回值:成功返回tm结构体指针,失败返回NULL,并置位错误码struct tm {int tm_sec;    /* Seconds (0-60) */int tm_min;    /* Minutes (0-59) */int tm_hour;   /* Hours (0-23) */int tm_mday;   /* Day of the month (1-31) */int tm_mon;    /* Month (0-11) */   //+1int tm_year;   /* Year - 1900 */    //+1900int tm_wday;   /* Day of the week (0-6, Sunday = 0) */ //周几int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */ //这一年中的第几天int tm_isdst;  /* Daylight saving time */ //夏令时};

8.fflush(刷新缓冲区)

int fflush(FILE *fp);
功能:将流缓冲区里的数据写入到实际的文件,Linux下只能刷新输出缓冲区
参数:@fp:文件指针
返回值:成功返回0,失败返回EOF

9.fseek、rewind、ftell(定位文件指针)

int fseek(FILE *stream, long offset, int whence);
功能:设置光标的位置
参数:@stream:文件指针@offset:光标的偏移>0 向后偏移=0 不偏移<0 向前偏移@whence:从那个位置偏移SEEK_SET //从开头开始偏移SEEK_CUR //从当前位置偏移SEEK_END //从结尾的位置偏移
返回值:成功返回0,失败返回-1置位错误码  eg:fseek(fp,0,SEEK_END); //将光标定位到文件的结尾fseek(fp,50,SEEK_SET);//将光标定位到第50个字节的位置fseek(fp,-5,SEEK_CUR);//将光标从当前位置向前偏移5个字节1. 文件a模式打开时,函数fseek无效2. rewind(fp)相当于fseek(fp, 0, SEEK_SET)3. 这3个函数只适用于2G以下的文件
void rewind(FILE *stream);
功能:将光标恢复到文件的开头(rewind = fseek(stream, 0, SEEK_SET))
参数:@stream:文件指针
返回值:无
long ftell(FILE *stream);
功能:返回光标到文件开头的字节数
参数:@stream:文件指针
返回值:成功返回字节数,失败返回-1置位错误码

10.freopen(重定向输入输出流)

在这里插入图片描述

#include <stdio.h>int main(int argc, const char **argv)
{if (freopen("1.txt", "w", stdout) == NULL) {perror("freopen");return -1;}printf("stdout --> 1.txt\n");fclose(stdout);printf("end!\n");return 0;
}

三、示例代码

1.fgetc(统计文本文件字符数)

#include <stdio.h>int main(int argc, const char **argv)
{int ch;FILE *fp;int count = 0;if (argc < 2) {printf("Usage: %s <file>\n", argv[0]);return -1;}//1ch = fgetc(stdin);if (ch == EOF) {perror("fgetc");return -1;}printf("ch is %c\n", ch);//2if ((fp = fopen(argv[1], "r")) == NULL) {perror("fopen");return -1;}while ((ch = fgetc(fp)) != EOF) {count++;}printf("%s total %d bytes!\n", argv[1], count);fclose(fp);return 0;
}

2.fputc(将a~z写入文件)

#include <stdio.h>int main(int argc, const char **argv)
{int ch;int ret;FILE *fp;if (argc < 2) {printf("Usage: %s <file>\n", argv[0]);return -1;}//1ret = fputc('a', stdout);if (ret == EOF) {perror("fputc");return -1;}putchar('\n');//2if ((fp = fopen(argv[1], "w")) == NULL) {perror("fopen");return -1;}for (ch = 'a'; ch <= 'z'; ch++) {fputc(ch, fp);}fclose(fp);return 0;
}

3.fgets(标准输入流写入buff)

#include <stdio.h>
#define N 6int main(int argc, char **argv)
{char buff[N];fgets(buff, N, stdin);printf("%s", buff);return 0;
}

4.fputs(将内存数据输出到标准输出流)

#include <stdio.h>int main(int argc, char **argv)
{puts("hello world");  //加换行char buff[] = "hello world\n";  //不加换行fputs(buff, stdout);return 0;
}

5.fread、fwrite(二进制文件读写)

#include <stdio.h>
#include <string.h>struct stu {char name[15];int age;char sex[10];
};int main(int argc, char **argv)
{	FILE *fp;struct stu s1,s2;int ret;if ((fp = fopen("1.bin", "w+")) == NULL) {perror("fopen");return -1;}strcpy(s1.name, "tanpeng");s1.age = 21;strcpy(s1.sex, "male");ret = fwrite(&s1, sizeof(s1), 1, fp);if (ret == EOF) {perror("fwrite");return -1;}fclose(fp);if ((fp = fopen("1.bin", "r+")) == NULL) {perror("fopen");return -1;}ret = fread(&s2, sizeof(s2), 1, fp);if (ret == EOF) {perror("fread");return -1;}printf("name:%s  age:%d  sex:%s\n", s2.name, s2.age, s2.sex);	 fclose(fp);return 0;
}

6.fflush(刷新流,刷新缓冲区)

#include <stdio.h>
#include <unistd.h>int main(int argc, char **argv)
{FILE *fp;int ret;if ((fp = fopen("1.bin", "a+")) == NULL) {perror("fopen");return -1;}ret = fwrite("abcdef", 6, 1, fp);if (ret == EOF) {perror("fwrite");return -1;}fflush(fp);while(1) {sleep(1);}fclose(fp);return 0;
}

7.ftell、fseek、rewind(定位流指针)

#include <stdio.h>
#include <unistd.h>int main(int argc, char **argv)
{FILE *fp;int ret;if ((fp = fopen("1.bin", "w")) == NULL) {perror("fopen");return -1;}ret = fwrite("abcdef", 6, 1, fp);if (ret == EOF) {perror("fwrite");return -1;}printf("start fp:%d\n", (int)ftell(fp));ret = fseek(fp, -4, SEEK_CUR);	ret = fwrite("ss", 2, 1, fp);if (ret == EOF) {perror("fwrite");return -1;}printf("fseek fp:%d\n", (int)ftell(fp));rewind(fp);	ret = fwrite("rr", 2, 1, fp);if (ret == EOF) {perror("fwrite");return -1;}printf("rewind fp:%d\n", (int)ftell(fp));fclose(fp);return 0;
}

8.fprintf、sprintf(格式化输出数据到文件、内存,常用sprintf)

#include <stdio.h>int main(int argc, char **argv)
{FILE *fp;char buff[40];int year = 2022;int month = 8;int day = 7;if ((fp = fopen("1.txt", "w+")) == NULL) {perror("fopen");return -1;}fprintf(fp, "%d-%d-%d\n", year, month, day);sprintf(buff, "%d-%d-%d", year, month, day);printf("%s\n", buff);fclose(fp);return 0;
}

9.fscanf、sscanf(将文件、内存数据格式化输入,可用作解析字符串)

#include <stdio.h>int main(int argc, char **argv)
{	FILE  *fp;char buff[40];int year = 2022;int month = 8;int day = 7;int fyear,fmonth,fday;int syear,smonth,sday;//1.fscanfif ((fp = fopen("1.txt", "w+")) == NULL) {perror("fopen");return -1;}fprintf(fp, "%d-%d-%d", year, month, day);rewind(fp);fscanf(fp, "%d-%d-%d", &fyear, &fmonth, &fday);printf("after fscanf:\n");printf("%d,%d,%d\n", fyear, fmonth, fday);//2.sscanfsprintf(buff, "%d-%d-%d", year, month, day);printf("%s\n", buff);sscanf(buff, "%d-%d-%d", &syear, &smonth, &sday);printf("after sscanf:\n");printf("%d,%d,%d\n", syear, smonth, sday);fclose(fp);	return 0;
}

四、案例源码

1.复制文件1

#include <stdio.h>int main(int argc,  char *argv[])
{FILE *fps, *fpd;int ch;if (argc < 3) {printf("Usage : %s <src_file> <dst_file>\n", argv[0]);return -1;}if ((fps = fopen(argv[1], "r")) == NULL) {perror("fopen");return -1;}if ((fpd = fopen(argv[2], "w")) == NULL) {perror("fopen");return -1;}while ((ch = fgetc(fps)) != EOF) {fputc(ch, fpd);}fclose(fps);fclose(fpd);return  0;}

2.统计文本文件行数

#include <stdio.h>
#include <string.h>#define  N  64int main(int argc,  char *argv[])
{FILE *fp;int line = 0;char buf[N];if (argc < 2) {printf("Usage: %s <file>\n", argv[0]);return -1;}if ((fp = fopen(argv[1], "r")) == NULL) {printf("fopen  error\n");return -1;}while (fgets(buf, N, fp) != NULL) {if (buf[strlen(buf)-1] == '\n') line++;}printf("the line of %s is %d\n", argv[1], line);return  0;}

3.复制文件2

#include <stdio.h>#define  N  64int main(int argc,  char *argv[])
{FILE *fps, *fpd;int buf[N];int n;if (argc < 3) {printf("Usage : %s <src_file> <dst_file>\n", argv[0]);return -1;}if ((fps = fopen(argv[1], "r")) == NULL) {perror("fopen src file");return -1;}if ((fpd = fopen(argv[2], "w")) == NULL) {perror("fopen dst file");return -1;}while ((n = fread(buf, 1, N, fps)) > 0) {fwrite(buf, 1, n, fpd);}fclose(fps);fclose(fpd);return  0;}

4.获取文件长度

#include <stdio.h>int main(int argc,  char *argv[])
{FILE *fp;if ((fp = fopen("test.txt", "r+")) == NULL) {perror("fopen");return -1;}fseek(fp, 0, SEEK_END);printf("length is %ld\n", ftell(fp));   return  0;}	

5.按指定格式打印时间

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <string.h>int main()
{FILE *fp;int line = 0;char buf[64];time_t t;struct tm *tp;if ((fp = fopen("test.txt", "a+")) == NULL) {perror("fopen");return -1;}while (fgets(buf, 64, fp) != NULL){if (buf[strlen(buf)-1] == '\n') line++;}   while ( 1 ){time(&t);tp = localtime(&t);fprintf(fp, "%02d, %d-%02d-%02d %02d:%02d:%02d\n", ++line, tp->tm_year+1900, tp->tm_mon+1,tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);fflush(fp);sleep(1);}	  return  0;}

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

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

相关文章

小程序开发音视频问题汇总及解决方案

目录 问题一&#xff1a;开发音视频&#xff0c;必用的两个小程序组件live-player和live-pusher&#xff0c;他们做什么用的&#xff0c;怎么才能使用&#xff1f; 问题二&#xff1a;一个页面只能插入一个 问题三&#xff1a;真机调试图片预览及视频全屏无反应 问题四&am…

在vue项目中下载swiper出现:Do not use ‘new’ for side effects报错问题

我报错的情况是&#xff1a;我在单文件组件vue文件中使用new Swiper&#xff0c;报了两个错误&#xff0c;图示&#xff1a; 第一个错误是&#xff1a;‘Swiper’ is not defined 第二个错误是&#xff1a;Do not use ‘new’ for side effects 解决办法&#xff1a; &#x…

5G无线技术基础自学系列 | MU-MIMO原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 MU-MIMO是指多个用户在上下行数据传输时…

【Linux】命令

常用命令 帮助&#xff08;Manual Pages&#xff0c;Manual&#xff1a;手册&#xff0c;特指参考文件&#xff09; man man <command_name> 打开目录&#xff08;change directory&#xff09; cd /etc/ cd /home 查看当前所在目录 pwd 创建一个名为 file 的文件&…

[附源码]计算机毕业设计JAVA校园共享单车系统

[附源码]计算机毕业设计JAVA校园共享单车系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

二、【React拓展】懒加载 lazy

文章目录1、适用点2、汇总1、适用点 懒加载往往配合路由一起使用&#xff0c;此处修改的项目是 二、【React-Router5】路由的基本使用 中的项目 首先从react中引入lazy import { lazy } from react 修改引入路由组件的写法 // import About from ./pages/About // import Home…

SequoiaDB湖仓一体分布式数据库2022.11月刊

本月看点速览 产品能力再获认可&#xff0c;入围多个榜单、报告 ‍精彩亮相2022沙丘大会湖仓一体专场 实力吸睛&#xff0c;获多家权威媒体关注与报道 生态圈不断扩大&#xff0c;与6家合作伙伴完成互认证 青杉计划2023进行中&#xff0c;一起攀登更高的“杉” 产品能力再获…

pip 安装 livetest 失败

pip 安装 livetest 失败1. 现象2. 解决方案(1) 下载(2) 移动并解压(3) 修改文件1) livetest-0.5/livetest/__init__.py2) livetest-0.5/setup.py3) livetest-0.5/test/test_select.py(4) 运行安装4. 验证1. 现象 pip 安装 livetest 失败 2. 解决方案 (1) 下载 官网下载 liv…

09-13-Hbase-shell入门操作

09-Hbase-shell入门操作&#xff1a; HBase Shell 操作 DDL基本操作 1&#xff0e;进入 HBase 客户端命令行 [roothadoop102 hbase-1.3.1]# bin/hbase shell 2&#xff0e;查看帮助命令 hbase(main):001:0> help 3&#xff0e;查看当前数据库中有哪些表 hbase(main):0…

网页添加灰色滤镜

网页添加灰色滤镜 b站的灰色滤镜 我校的灰色滤镜 CSDN的灰色滤镜 自己调制css主题,给网页加上滤镜. 更快捷的,可以在可以调制css的浏览器插件中加上滤镜,只要开启插件就会自动修改网站滤镜 以darkreader为例打开其开发者工具 *INVERT .jfk-bubble.gtx-bubble .captcheck_a…

ABAP CLEAR REFRESH FREE 说明(刘欣)

本文仔细测试总结了ABAP中的clear、refresh、free&#xff0c;因为很多时候程序的BUG就是出现在变量没有清理干净&#xff0c;希望整理一个定式出来以后少出BUG。 用clear、refresh、free对带表头的表执行的测试结果如下表&#xff1a; 看起来&#xff0c;最好的避免这些清空命…

总结:SpringBoot内嵌Tomcat原理

一、介绍 一般我们启动web服务都需要单独的去安装tomcat&#xff0c;而Springboot自身却直接整合了Tomcat&#xff0c;什么原理呢&#xff1f; 二、原理 SpringBoot应用只需要引入spring-boot-starter-web中这个依赖&#xff0c;应用程序就默认引入了tomcat依赖&#xff0c;其…

C语言——malloc开辟矩阵

目录 用动态内存开辟矩阵 矩阵初始化 用动态内存开辟矩阵 动态内存更多的知识在这篇博客&#xff0c;本文将介绍用malloc开辟矩阵。 malloc是C语言中用来动态开辟内存的&#xff0c;通过malloc函数可以向计算机申请一串连续的内存空间。 因为malloc开辟的内存在堆上&#…

Observability:从零开始创建 Java 微服务并监控它 (二)

这篇文章是继上一篇文章 “Observability&#xff1a;从零开始创建 Java 微服务并监控它 &#xff08;一&#xff09;” 的续篇。在上一篇文章中&#xff0c;我们讲述了如何创建一个 Java web 应用&#xff0c;并使用 Filebeat 来收集应用所生成的日志。在今天的文章中&#xf…

uni-app 超详细教程(三)(从菜鸟到大佬)

本文中内容为&#xff1a; 1. 支付功能&#xff08;微信支付&#xff0c;支付宝支付&#xff09; 2. 项目打包&#xff1a;&#xff08;APP打包&#xff0c;H5打包&#xff0c;微信小程序打包&#xff09; 一&#xff0c;uni - app 的支付功能 一、微信支付 1、登录微信开…

华为云数据库GaussDB(for Cassandra)揭秘:高性能低成本是什么样的体验?

在我们的日常理念中&#xff0c;追求性价比是最为常见的&#xff0c;但是你知道购买低配置还能享受高性能、低延时、超低价的数据库有哪些吗&#xff1f;今天我们就用数据说话&#xff0c;带你深入了解GaussDB(for Cassandra)挑战高性价比&#xff01; 众所周知&#xff0c;有…

操作系统实验5:信号量的实现与应用

写在最前的总结 下面的实验内容是在完整做完实验时候补充的&#xff0c;这里先把踩过的坑记录一下。 调试总结 先在Ubuntu上模拟生产者—消费者问题。这个实验分为两大部分&#xff0c;一个是实现信号量&#xff0c;另一个是验证信号量。对于第二个&#xff0c;建议先在Ubun…

【MySQL基础】MySQL常用的图形化管理工具有那些?

目录 一、为什么要使用MySQL图形化管理工具 原因 / 目的 / 作用 二、什么是DOS窗口? 三、常见的MySQL图形化管理工具有那些&#xff1f; 四、 常见几个MySQL图形工具的介绍 Navicat SQLyog MySQL Workbench DataGrip 五、Navicat图形工具的安装与使用 第一步&#x…

学习响应式布局

针对性内容 页面设计在不同设备的显示情况布局只会使用float定位&#xff0c;而不会掌握flex不能很好的使用rem作为设计单位掌握响应式布局、弹性等常见布局 学习内容 css中媒体查询的作用和使用方法flex弹性盒子的用法rem的作用和使用方法目录 针对性内容 学习内容 Media…

[iOS]App Store Connect添加银行卡时的CNAPS代码查询

App Store Connect 协议、税务和银行业务中&#xff0c;给付费APP类型添加银行卡需要填写CNAPS代码CNAPS代码&#xff0c;其实就是联行号。 联行号又称大额行号、银联号、银行行号或CNAPS号。 银行联行号查询