C++笔记之C语言中常见的文件操作函数汇总

C++笔记之C语言中常见的文件操作函数汇总

文章目录

  • C++笔记之C语言中常见的文件操作函数汇总
    • 1. `fopen()`: 打开文件并返回文件指针
    • 2. `fclose()`: 关闭文件
    • 3. `fread()`: 从文件中读取数据
    • 4. `fwrite()`: 向文件写入数据
    • 5. `fgetc()`: 从文件中读取一个字符
    • 6. `fputc()`: 向文件写入一个字符
    • 7. `fgets()`: 从文件中读取一行文本
    • 8. `fputs()`: 向文件写入一行文本
    • 9. `fprintf()`: 格式化写入数据到文件
    • 10. `fscanf()`: 从文件中格式化读取数据
    • 11. `feof()`: 检查文件结束标志
    • 12. `ftell()`: 获取文件位置指针的当前位置
    • 13. `fseek()`: 设置文件位置指针的位置
    • 14. `rewind()`: 将文件位置指针重置到文件的开头
    • 15. `remove()`: 删除文件
    • 16. `rename()`: 重命名文件
    • 17. `tmpfile()`: 创建临时文件
    • 18. `tmpnam()`: 生成临时文件名
    • 19. `feof()`: 检查文件结束标志
    • 20. `fflush()`: 刷新文件缓冲区
    • 21. `ferror()`: 检查文件错误标志
    • 22. `perror()`: 打印错误消息
    • 23. `clearerr()`: 清除文件错误和结束标志
    • 24. `setvbuf()`: 设置文件缓冲区
    • 25. `fileno()`: 获取文件描述符
    • 26. `flockfile()`: 锁定文件以进行线程安全的访问
    • 27. `funlockfile()`: 解锁文件以允许其他线程访问
    • 28. `getc()`: 从标准输入流中读取一个字符
    • 29. `putc()`: 将字符写入标准输出流
    • 30. `getchar()`: 从标准输入流中读取一个字符
    • 31. `putchar()`: 将字符写入标准输出流
    • 32. `feof()`: 检查文件结束标志
    • 33. `ferror()`: 检查文件错误标志
    • 34. `clearerr()`: 清除文件错误和结束标志
    • 35.一些易混淆的函数以及它们的详细说明
    • 36.每个函数的参数列表参数数量说明

1. fopen(): 打开文件并返回文件指针

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w"); // 以写入模式打开文件if (file == NULL) {perror("文件打开失败");return 1;}// 使用文件指针进行写入操作fclose(file); // 关闭文件return 0;
}

2. fclose(): 关闭文件

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file == NULL) {perror("文件打开失败");return 1;}// 使用文件指针进行写入操作fclose(file); // 关闭文件return 0;
}

3. fread(): 从文件中读取数据

#include <stdio.h>int main() {FILE *file = fopen("data.bin", "rb"); // 以二进制模式打开文件以供读取if (file == NULL) {perror("文件打开失败");return 1;}char buffer[100];size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer), file);// 处理读取的数据fclose(file);return 0;
}

4. fwrite(): 向文件写入数据

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w"); // 以写入模式打开文件if (file == NULL) {perror("文件打开失败");return 1;}char data[] = "Hello, World!";size_t bytesWritten = fwrite(data, sizeof(char), sizeof(data), file);// 处理写入的数据fclose(file);return 0;
}

5. fgetc(): 从文件中读取一个字符

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r");if (file == NULL) {perror("文件打开失败");return 1;}int ch = fgetc(file);if (ch != EOF) {// 处理读取到的字符}fclose(file);return 0;
}

6. fputc(): 向文件写入一个字符

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w");if (file == NULL) {perror("文件打开失败");return 1;}int ch = 'A';int result = fputc(ch, file);if (result == ch) {// 写入成功}fclose(file);return 0;
}

7. fgets(): 从文件中读取一行文本

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r");if (file == NULL) {perror("文件打开失败");return 1;}char buffer[100];if (fgets(buffer, sizeof(buffer), file) != NULL) {// 处理读取到的文本行}fclose(file);return 0;
}

8. fputs(): 向文件写入一行文本

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w");if (file == NULL) {perror("文件打开失败");return 1;}const char *text = "Hello, World!";if (fputs(text, file) != EOF) {// 写入成功}fclose(file);return 0;
}

9. fprintf(): 格式化写入数据到文件

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w");if (file == NULL) {perror("文件打开失败");return 1;}int number = 42;fprintf(file, "The answer is: %d\n", number);fclose(file);return 0;
}

10. fscanf(): 从文件中格式化读取数据

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r");if (file == NULL) {perror("文件打开失败");return 1;}int number;if (fscanf(file, "%d", &number) == 1) {// 处理读取到的整数}fclose(file);return 0;
}

11. feof(): 检查文件结束标志

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r");if (file == NULL) {perror("文件打开失败");return 1;}while (!feof(file)) {int ch = fgetc(file);if (ch != EOF) {// 处理读取到的字符}}fclose(file);return 0;
}

12. ftell(): 获取文件位置指针的当前位置

#include <stdio.h>int main() {FILE *file = fopen("data.bin", "rb");if (file == NULL) {perror("文件打开失败");return 1;}fseek(file, 0, SEEK_END); // 移动文件指针到文件末尾long fileSize = ftell(file); // 获取当前位置// 处理文件大小fclose(file);return 0;
}

13. fseek(): 设置文件位置指针的位置

#include <stdio.h>int main() {FILE *file = fopen("data.bin", "rb");if (file == NULL) {perror("文件打开失败");return 1;}fseek(file, 50, SEEK_SET); // 移动文件指针到文件的第 50 个字节位置// 处理文件指针的位置fclose(file);return 0;
}

14. rewind(): 将文件位置指针重置到文件的开头

#include <stdio.h>int main() {FILE *file = fopen("data.bin", "rb");if (file == NULL) {perror("文件打开失败");return 1;}rewind(file); // 重置文件指针到文件开头// 处理文件内容fclose(file);return 0;
}

15. remove(): 删除文件

#include <stdio.h>int main() {if (remove("example.txt") == 0) {// 文件删除成功} else {perror("文件删除失败");}return 0;
}

16. rename(): 重命名文件

#include <stdio.h>int main() {if (rename("old_name.txt", "new_name.txt") == 0) {// 文件重命名成功} else {perror("文件重命名失败");}return 0;
}

17. tmpfile(): 创建临时文件

#include <stdio.h>int main() {FILE *tempFile = tmpfile(); // 创建临时文件if (tempFile != NULL) {// 使用临时文件进行操作} else {perror("创建临时文件失败");}return 0;
}

18. tmpnam(): 生成临时文件名

#include <stdio.h>int main() {char *tempFileName = tmpnam(NULL); // 生成临时文件名if (tempFileName != NULL) {// 使用临时文件名} else {perror("生成临时文件名失败");}return 0;
}

19. feof(): 检查文件结束标志

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r");if (file == NULL) {perror("文件打开失败");return 1;}while (!feof(file)) {int ch = fgetc(file);if (ch != EOF) {// 处理读取到的字符}}fclose(file);return 0;
}

20. fflush(): 刷新文件缓冲区

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w");if (file == NULL) {perror("文件打开失败");return 1;}fputs("Hello, World!", file);fflush(file); // 刷新文件缓冲区,确保数据被写入磁盘fclose(file);return 0;
}

21. ferror(): 检查文件错误标志

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file == NULL) {perror("文件打开失败");return 1;}int ch = fgetc(file);if (ch == EOF) {if (ferror(file)) {perror("读取文件时发生错误");}}fclose(file);return 0;
}

22. perror(): 打印错误消息

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file == NULL) {perror("文件打开失败");return 1;}// 尝试执行文件操作fclose(file);return 0;
}

23. clearerr(): 清除文件错误和结束标志

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file == NULL) {perror("文件打开失败");return 1;}clearerr(file); // 清除错误和结束标志// 尝试执行文件操作fclose(file);return 0;
}

24. setvbuf(): 设置文件缓冲区

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file == NULL) {perror("文件打开失败");return 1;}char buffer[1024];setvbuf(file, buffer, _IOFBF, sizeof(buffer)); // 设置文件缓冲区// 使用文件进行写入操作fclose(file);return 0;
}

25. fileno(): 获取文件描述符

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file == NULL) {perror("文件打开失败");return 1;}int fd = fileno(file); // 获取文件描述符// 使用文件描述符进行操作fclose(file);return 0;
}

26. flockfile(): 锁定文件以进行线程安全的访问

#include <stdio.h>
#include <pthread.h>void *thread_function(void *arg) {FILE *file = (FILE *)arg;flockfile(file); // 锁定文件// 使用文件进行操作funlockfile(file); // 解锁文件return NULL;
}int main() {FILE *file = fopen("example.txt", "w");if (file == NULL) {perror("文件打开失败");return 1;}pthread_t thread;pthread_create(&thread, NULL, thread_function, file);// 主线程也可以使用文件进行操作pthread_join(thread, NULL);fclose(file);return 0;
}

27. funlockfile(): 解锁文件以允许其他线程访问

#include <stdio.h>
#include <pthread.h>void *thread_function(void *arg) {FILE *file = (FILE *)arg;flockfile(file); // 锁定文件// 使用文件进行操作funlockfile(file); // 解锁文件return NULL;
}int main() {FILE *file = fopen("example.txt", "w");if (file == NULL) {perror("文件打开失败");return 1;}pthread_t thread;pthread_create(&thread, NULL, thread_function, file);// 主线程也可以使用文件进行操作pthread_join(thread, NULL);fclose(file);return 0;
}

28. getc(): 从标准输入流中读取一个字符

#include <stdio.h>int main() {int ch = getc(stdin); // 从标准输入流读取一个字符if (ch != EOF) {// 处理读取到的字符}return 0;
}

29. putc(): 将字符写入标准输出流

#include <stdio.h>int main() {int ch = 'A';int result = putc(ch, stdout); // 将字符写入标准输出流if (result == ch) {// 写入成功}return 0;
}

30. getchar(): 从标准输入流中读取一个字符

#include <stdio.h>int main() {int ch = getchar(); // 从标准输入流读取一个字符if (ch != EOF) {// 处理读取到的字符}return 0;
}

31. putchar(): 将字符写入标准输出流

#include <stdio.h>int main() {int ch = 'A';int result = putchar(ch); // 将字符写入标准输出流if (result == ch) {// 写入成功}return 0;
}

32. feof(): 检查文件结束标志

#include <stdio.h>int main() {while (!feof(stdin)) {int ch = getc(stdin);if (ch != EOF) {// 处理读取到的字符}}return 0;
}

33. ferror(): 检查文件错误标志

#include <stdio.h>int main() {int ch = getc(stdin);if (ch == EOF) {if (ferror(stdin)) {perror("读取标准输入流时发生错误");}}return 0;
}

34. clearerr(): 清除文件错误和结束标志

#include <stdio.h>int main() {int ch = getc(stdin);if (ch == EOF) {clearerr(stdin); // 清除错误和结束标志}return 0;
}

35.一些易混淆的函数以及它们的详细说明

  1. fread()fwrite(): 这两个函数用于二进制文件的读取和写入。fread() 用于从文件中读取二进制数据,而 fwrite() 用于将二进制数据写入文件。它们不适用于文本文件。

  2. fgetc()fputc(): 这两个函数用于字符级别的读取和写入。fgetc() 从文件中读取一个字符,而 fputc() 将一个字符写入文件。它们适用于文本文件。

  3. fgets()fputs(): 这两个函数用于文本行的读取和写入。fgets() 从文件中读取一行文本,而 fputs() 将一行文本写入文件。它们适用于文本文件。

  4. getc()putc(): 这两个函数类似于 fgetc()fputc(),但它们操作标准输入和标准输出流,而不是文件。getc(stdin) 从标准输入中读取一个字符,而 putc(ch, stdout) 将字符写入标准输出。

  5. getchar()putchar(): 这两个函数也操作标准输入和标准输出流,类似于 getc()putc(),但它们不需要传递流参数。getchar() 从标准输入中读取一个字符,而 putchar() 将字符写入标准输出。

  6. feof()ferror(): 这两个函数都用于检查文件操作的状态,但它们检查的是不同的条件。feof() 检查文件结束标志,如果文件已到达末尾,它返回非零值。ferror() 检查文件错误标志,如果发生了文件相关的错误,它返回非零值。通常,你会在文件操作之后使用这两个函数来检查状态。

36.每个函数的参数列表参数数量说明

#include <stdio.h>int main() {// fopen(): 2个参数FILE *file = fopen("example.txt", "w"); // 文件名和文件打开模式// fclose(): 1个参数fclose(file); // 文件指针// fread(): 4个参数char buffer[100];size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer), file); // 数据缓冲区,每个数据项的大小,数据项的数量,文件指针// fwrite(): 4个参数char data[] = "Hello, World!";size_t bytesWritten = fwrite(data, sizeof(char), sizeof(data), file); // 数据缓冲区,每个数据项的大小,数据项的数量,文件指针// fgetc(): 1个参数int ch = fgetc(file); // 文件指针// fputc(): 2个参数int ch = 'A';int result = fputc(ch, file); // 字符,文件指针// fgets(): 3个参数char buffer[100];if (fgets(buffer, sizeof(buffer), file) != NULL) { // 字符串缓冲区,最大读取字符数,文件指针// 处理读取到的文本行}// fputs(): 2个参数const char *text = "Hello, World!";if (fputs(text, file) != EOF) { // 字符串,文件指针// 写入成功}// fprintf(): 2个参数int number = 42;fprintf(file, "The answer is: %d\n", number); // 文件指针,格式化字符串和数据// fscanf(): 2个参数int number;if (fscanf(file, "%d", &number) == 1) { // 文件指针,格式化字符串和数据// 处理读取到的整数}// feof(): 1个参数while (!feof(file)) { // 文件指针int ch = fgetc(file);if (ch != EOF) {// 处理读取到的字符}}// ftell(): 1个参数long currentPosition = ftell(file); // 文件指针// fseek(): 3个参数fseek(file, 50, SEEK_SET); // 文件指针,偏移量,起始位置// rewind(): 1个参数rewind(file); // 文件指针// remove(): 1个参数if (remove("example.txt") == 0) { // 文件名// 文件删除成功}// rename(): 2个参数if (rename("old_name.txt", "new_name.txt") == 0) { // 旧文件名,新文件名// 文件重命名成功}// tmpfile(): 无参数FILE *tempFile = tmpfile(); // 无参数// tmpnam(): 1个参数char *tempFileName = tmpnam(NULL); // 字符串缓冲区(可选)// feof(): 1个参数while (!feof(file)) { // 文件指针int ch = fgetc(file);if (ch != EOF) {// 处理读取到的字符}}// fflush(): 1个参数fflush(file); // 文件指针// ferror(): 1个参数int ch = fgetc(file);if (ch == EOF) {if (ferror(file)) { // 文件指针perror("读取文件时发生错误");}}// perror(): 1个参数FILE *file = fopen("example.txt", "r");if (file == NULL) {perror("文件打开失败"); // 错误消息前缀字符串return 1;}// clearerr(): 1个参数int ch = fgetc(file);if (ch == EOF) {clearerr(file); // 文件指针}// setvbuf(): 3个参数char buffer[1024];setvbuf(file, buffer, _IOFBF, sizeof(buffer)); // 文件指针,缓冲区,缓冲模式// fileno(): 1个参数int fileDescriptor = fileno(file); // 文件指针// flockfile(): 1个参数flockfile(file); // 文件指针// funlockfile(): 1个参数funlockfile(file); // 文件指针// getc(): 1个参数int ch = getc(stdin); // 文件指针// putc(): 2个参数int ch = 'A';int result = putc(ch, stdout); // 字符,文件指针// getchar(): 无参数int ch = getchar(); // 无参数// putchar(): 1个参数int ch = 'A';int result = putchar(ch); // 字符// feof(): 1个参数while (!feof(stdin)) { // 文件指针int ch = getc(stdin);if (ch != EOF) {// 处理读取到的字符}}// ferror(): 1个参数int ch = getc(stdin);if (ch == EOF) {if (ferror(stdin)) { // 文件指针perror("读取标准输入流时发生错误");}}// clearerr(): 1个参数int ch = getc(stdin);if (ch == EOF) {clearerr(stdin); // 文件指针}return 0;
}

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

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

相关文章

Android 13.0 SystemUI下拉状态栏时间格式的修改(二)

1.概述 在13.0的系统产品开发中,在通过上一篇博客已经实现修改了时间显示格式,但是客户修改下拉状态栏时间显示格式为分行显示,即第一行显示时间用大字体显示, 第二行用小字体显示当前日期和周几这样的显示格式 于是继续进行修改 2.SystemUI下拉状态栏时间格式的修改(二)…

开发chromium你要知道的几个地址

我们在开发chromium的时候需要使用到各种各样的工具和网站,下面给小伙伴们介绍一些我常用的网站地址。 一、离线源码下载 已经将源码根据tag号进行打包,只需要修改后面对应的tag号就可以下载特定版本的源码。优点下载速度快。缺点:只包含源码没有其他的提交记录等。 http:…

【ARM】(1)架构简介

前言 ARM既可以认为是一个公司的名字&#xff0c;也可以认为是对一类微处理器的通称&#xff0c;还可以认为是一种技术的名字。 ARM公司是专门从事基于RISC技术芯片设计开发的公司&#xff0c;作为知识产权&#xff08;IP&#xff09;供应商&#xff0c;本身不直接从事芯片生产…

009:获取20日均线数据

再《005》中我们获得了K线数据&#xff0c;现在我们要把他的20日均线数据也获取出来。然后通过计算后&#xff0c;保存在新的一列中&#xff1a; import pandas as pd import tkinter as tk from tkinter import filedialog import ospathdef open_file():global pathpath fi…

1.5 JAVA程序运行的机制

**1.5 Java程序的运行机制** --- **简介&#xff1a;** Java程序的运行涉及两个主要步骤&#xff1a;编译和运行。这种机制确保了Java的跨平台特性。 **主要内容&#xff1a;** 1. **Java程序的执行过程**&#xff1a; - **编译**&#xff1a;首先&#xff0c;扩展名为.jav…

Nginx的安装

Nginx的安装 mac下安装 首先看一下nginx的信息 #执行命令brew info nginx#下面来解释一下下面的意思--------------------------------------------------------#最新已经到了1.19.6版本nginx: stable 1.19.6 (bottled), HEADHTTP(S) server and reverse proxy, and IMAP/POP3 …

VMware 17pro安装流程附带密钥手把手教

VMware 17pro centos-8.5.2111-isos-x86_64安装包下载_开源镜像站-阿里云 安装VMware 17pro 下一步 勾选我接营许可协议中的条款点击下一步 更改路径后点击下一步 注意两个都要取消勾选不然会自动更新 下一步即可 最后一步为安装就行&#xff08;我电脑上有VMware 16pro所以我的…

基于FPGA的拔河游戏设计

基于FPGA的拔河游戏机 设计内容: (1)拔河游戏机需要11个发光二极管排成一行,开机 后只有中间一个亮点,作为拔河的中间线。 游戏双方 各持一个按键,迅速且不断地按动产生脉冲,哪方按 得快,亮点就向哪方移动, 每按一次,亮点移动一次。 移到任一方二极管的终端,该方就…

拓世AI|中秋节营销攻略,创意文案和海报一键生成

秋风意境多诗情&#xff0c;中秋月圆思最浓。又是一年中秋节&#xff0c;作为中国传统的重要节日之一&#xff0c;中秋节的意义早已不再仅仅是一家团圆的节日&#xff0c;更是一场商业盛宴。品牌方们纷纷加入其中&#xff0c;希望能够借助这一节日为自己的产品赢得更多的关注和…

Flexmonster Pivot Table 2.9.1 Crack

Flexmonster Pivot Table & Charts 2.9.X 是一个专门为实时可视化复杂业务数据而设计的组件。该实用程序是用JavaScript编写的&#xff0c;不需要额外的插件&#xff0c;也不受运行的服务器类型的限制。事实上&#xff0c;它的设计可以轻松地与当今大多数可用的开发框架集成…

lv8 嵌入式开发-网络编程开发 14

目录 1 I/O基本概念 1.1 IO概念 1.2 同步和异步 1.3 阻塞和非阻塞 2 五种I/O模型 2.1 阻塞IO 2.2 非阻塞I/O 2.3 多路复用I/O ​编辑 2.4 信号驱动式I/O ​编辑 2.5 异步I/O模型​编辑 3 五种I/O模型比较 4 练习 1 I/O基本概念 1.1 IO概念 I/O即数据的读取&#x…

华为云 云证书(SSL)管理服务

问题描述&#xff0c;已经给域名申请了ssl证书&#xff0c;并且已经配置了ELB&#xff0c;目前访问正常&#xff0c;但是提示不安全的访问。 解决方法&#xff1a;在云证书管理界面&#xff0c;查看已经是审核完成的状态&#xff0c;需要点击更多&#xff0c;重新推送下证书&am…

探索ClickHouse——使用MaterializedView存储kafka传递的数据

在《探索ClickHouse——连接Kafka和Clickhouse》中&#xff0c;我们讲解了如何使用kafka engin连接kafka&#xff0c;并读取topic中的数据。但是遇到了一个问题&#xff0c;就是数据只能读取一次&#xff0c;即使后面还有新数据发送到该topic&#xff0c;该表也读不出来。 为了…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Badge

可以附加在单个组件上用于信息标记的容器组件。该组件从API Version 7开始支持。 支持单个子组件。子组件类型&#xff1a;系统组件和自定义组件&#xff0c;支持渲染控制类型&#xff08;if/else、ForEach和LazyForEach&#xff09;。 一、接口 方法1&#xff1a; Badge(value…

STM32--人体红外感应开关

本文主要介绍基于STM32F103C8T6和人体红外感应开关实现的控制算法 简介 人体红外模块选用HC-SR501人体红外传感器&#xff0c;人体红外感应的主要器件为人体热释电红外传感器。人体都有恒定的体温&#xff0c;一般在36~37度&#xff0c;所以会发出特定波长的红外线&#xff0…

Redis最常见应用场景

缓存&#xff08;Cache&#xff09; Redis的第一个应用场景是Redis作为缓存对象来加速Web应用的访问。 在该场景下&#xff0c;有一些存储于数据库中的数据会被频繁访问&#xff0c;如果频繁的访问数据库&#xff0c;数据库负载会升高&#xff0c;同时由于数据库IO比较慢&…

计算机视觉——飞桨深度学习实战-深度学习网络模型

深度学习网络模型的整体架构主要数据集、模型组网以及学习优化过程三部分&#xff0c;本章主要围绕着深度学习网络模型的算法架构、常见模型展开了详细介绍&#xff0c;从经典的深度学习网络模型以CNN、RNN为代表&#xff0c;到为了解决显存不足、实时性不够等问题的轻量化网络…

[Linux]线程互斥

[Linux]线程互斥 文章目录 [Linux]线程互斥线程并发访问问题线程互斥控制--加锁pthread_mutex_init函数pthread_mutex_destroy函数pthread_mutex_lock函数pthread_mutex_unlock函数锁相关函数使用示例使用锁的细节加锁解锁的实现原理 线程安全概念常见的线程不安全的情况常见的…

岩土工程监测中无线振弦采集仪的高精度高稳定性的重要性

岩土工程监测中无线振弦采集仪的高精度高稳定性的重要性 岩土工程中&#xff0c;无线振弦采集仪是一种用于测量结构物振动情况的关键设备。该设备主要是为了监测结构物的破坏情况、安全性能、实时振动等相关参数的变化&#xff0c;以便于及时掌握结构物的变化情况&#xff0c;…

【数据结构】手撕归并排序(含非递归)

目录 一&#xff0c;归并排序&#xff08;递归&#xff09; 1&#xff0c;基本思想 2&#xff0c;思路实现 二&#xff0c;归并排序&#xff08;非递归&#xff09; 1&#xff0c;思路实现 2&#xff0c;归并排序的特性总结&#xff1a; 一&#xff0c;归并排序&#xff0…