70、C++ 流输入输出深度解析

C++ 流输入输出深度解析

1. 流的基本概念

在 C++ 中,输入输出操作是通过流(streams)来实现的,流是字节序列。在输入操作中,字节从设备(如键盘、磁盘驱动器、网络连接等)流向主内存;在输出操作中,字节从主内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等)。

应用程序会为字节赋予意义,这些字节可以代表字符、原始数据、图形图像、数字语音、数字视频或应用程序所需的任何其他信息。系统的输入输出机制需要稳定可靠地在设备和内存之间传输字节。这种传输通常涉及一些机械运动,如磁盘或磁带的旋转,或者键盘按键的敲击。这些传输所花费的时间通常远大于处理器内部处理数据所需的时间。因此,输入输出操作需要精心规划和调整,以确保最佳性能。

C++ 提供了“低级”和“高级”两种输入输出能力:
- 低级输入输出(未格式化输入输出) :指定要在设备和内存之间传输的字节数量。在这种传输中,单个字节是关注的对象。这种低级能力提供了高速、大容量的传输,但不太方便。
- 高级输入输出(格式化输入输出) :程序员通常更喜欢这种方式,在这种方式中,字节被分组为有意义的单元,如整数、浮点数、字符、字符串和用户定义的类型。除了大容量文件处理之外,这些面向类型的能力对于大多数输入输出操作来说是令人满意的。

2. 经典流与标准流

过去,C++ 的经典流库支持字符的输入输出。由于一个字符通常占用一个字节,它只能表示有限的字符集(如本书大多数读者使用的 ASCII 字符集或其他流行的字符集)。然而,许多语言使用的字母表包含的字符数量超过了单字节字符所能表示的范围。ASCII 字符集无法提供这些字符,而 Unicode 字符集可以。Unicode 是一个广泛的国际字符集,它代表了世界上大多数“商业上可行”的语言、数学符号等。

C++ 包含标准流库,它使开发人员能够构建能够处理 Unicode 字符输入输出操作的系统。为此,C++ 引入了 wchar_t 类型,它可以存储 Unicode 字符。C++ 标准还将只处理字符的经典 C++ 流类重新设计为类模板,并分别针对 char 和 wchar_t 类型的字符处理进行了特化。我们通常使用 char 特化版本。 wchar_t 类型的大小没有在标准中指定。C++11 新增了 char16_t 和 char32_t 类型来表示 Unicode 字符,以提供具有明确指定大小的字符类型。

3. iostream 库头文件

C++ 的 iostream 库提供了数百种输入输出能力,几个头文件包含了该库接口的部分内容:
- <iostream> :大多数 C++ 程序都会包含这个头文件,它声明了所有流输入输出操作所需的基本服务。该头文件定义了 cin 、 cout 、 cerr 和 clog 对象,它们分别对应标准输入流、标准输出流、无缓冲的标准错误流和有缓冲的标准错误流。同时提供了未格式化和格式化的输入输出服务。
- <iomanip> :声明了使用所谓的参数化流操纵器(如 setw 和 setprecision )进行格式化输入输出时有用的服务。
- <fstream> :声明了文件处理的服务。

4. 流输入输出类和对象

iostream 库提供了许多处理常见输入输出操作的模板:
- basic_istream :支持流输入操作。
- basic_ostream :支持流输出操作。
- basic_iostream :支持流输入和流输出操作。

每个模板都有一个预定义的模板特化,用于支持字符输入输出。此外, iostream 库还提供了一组 typedef 来为这些模板特化提供别名。 typedef 用于为数据类型声明同义词(别名),有时可以使用它来创建更短或更易读的类型名称。例如:

typedef Card *CardPtr;

上述语句定义了一个额外的类型名 CardPtr ,作为 Card * 类型的同义词。使用 typedef 创建名称并不会创建新的数据类型,只是创建了一个新的类型名。

typedef 的相关特化如下:
- istream :表示 basic_istream<char> ,支持字符输入。
- ostream :表示 basic_ostream<char> ,支持字符输出。
- iostream :表示 basic_iostream<char> ,支持字符的输入和输出。

流输入输出模板的继承关系如下:

classDiagram
    class basic_ios
    class basic_istream
    class basic_ostream
    class basic_iostream
    basic_istream --|> basic_ios
    basic_ostream --|> basic_ios
    basic_iostream --|> basic_istream
    basic_iostream --|> basic_ostream

运算符重载为输入输出操作提供了方便的表示法:
- 左移运算符( << ) :被重载用于表示流输出,称为流插入运算符。
- 右移运算符( >> ) :被重载用于表示流输入,称为流提取运算符。

这些运算符可以与标准流对象 cin 、 cout 、 cerr 和 clog 一起使用,也可以与你在自己的代码中创建的流对象一起使用。

5. 标准流对象
  • cin :预定义对象,是 istream 的实例,连接到标准输入设备,通常是键盘。例如:
int grade;
cin >> grade; // 数据按照箭头方向流动

编译器会确定 grade 的数据类型,并选择合适的重载流提取运算符。如果 grade 已经正确声明,流提取运算符不需要额外的类型信息。 >> 运算符被重载用于输入基本类型、字符串和指针值的数据项。
- cout :预定义对象,是 ostream 的实例,连接到标准输出设备,通常是显示屏。例如:

int grade = 80;
cout << grade; // 数据按照箭头方向流动

编译器会确定 grade 的数据类型(假设 grade 已经正确声明),并选择合适的流插入运算符。 << 运算符被重载用于输出基本类型、字符串和指针值的数据项。
- cerr :预定义对象,是 ostream 的实例,连接到标准错误设备,通常是屏幕。对 cerr 的输出是无缓冲的,这意味着每次向 cerr 插入流都会立即显示输出,这适用于及时向用户通知错误。
- clog :预定义对象,是 ostream 类的实例,连接到标准错误设备。对 clog 的输出是有缓冲的。这意味着每次向 clog 插入数据可能会将其输出保存在缓冲区(即内存中的一个区域)中,直到缓冲区满或缓冲区被刷新。缓冲是操作系统课程中讨论的一种输入输出性能增强技术。

6. 文件处理模板

C++ 的文件处理使用以下类模板:
- basic_ifstream :用于文件输入。
- basic_ofstream :用于文件输出。
- basic_fstream :用于文件的输入和输出。

与标准流一样,C++ 为这些类模板提供了 typedef :
- ifstream :表示 basic_ifstream<char> ,支持从文件中进行字符输入。
- ofstream :表示 basic_ofstream<char> ,支持向文件中进行字符输出。
- fstream :表示 basic_fstream<char> ,支持从文件中进行字符输入和向文件中进行字符输出。

basic_ifstream 继承自 basic_istream , basic_ofstream 继承自 basic_ostream , basic_fstream 继承自 basic_iostream 。其继承关系如下:

classDiagram
    class basic_ios
    class basic_istream
    class basic_ostream
    class basic_iostream
    class basic_ifstream
    class basic_ofstream
    class basic_fstream
    basic_istream --|> basic_ios
    basic_ostream --|> basic_ios
    basic_iostream --|> basic_istream
    basic_iostream --|> basic_ostream
    basic_ifstream --|> basic_istream
    basic_ofstream --|> basic_ostream
    basic_fstream --|> basic_iostream

完整的流输入输出类层次结构提供了大部分所需的功能。你可以查阅 C++ 系统的类库参考以获取更多文件处理信息。

7. 流输出

ostream 提供了格式化和未格式化的输出能力,包括:
- 使用流插入运算符( << )输出标准数据类型。
- 通过 put 成员函数输出字符。
- 通过 write 成员函数进行未格式化输出。
- 以十进制、八进制和十六进制格式输出整数。
- 以各种精度、强制小数点、科学记数法和固定记数法输出浮点数。
- 在指定宽度的字段中对齐输出数据。
- 在字段中用指定字符填充输出数据。
- 在科学记数法和十六进制记数法中输出大写字母。

7.1 char * 变量的输出

C++ 会自动确定数据类型,这比 C 有所改进,但有时这个特性会带来一些问题。例如,假设我们想打印存储在 char * 指针中的地址。 << 运算符已被重载,将 char * 作为以空字符结尾的 C 风格字符串输出。要输出地址,可以将 char * 强制转换为 void * (可以对任何指针变量进行此操作)。示例代码如下:

#include <iostream>
using namespace std;

int main()
{
    const char *const word = "again";
    cout << "Value of word is: " << word << endl
         << "Value of static_cast< const void * >( word ) is: " 
         << static_cast< const void * >( word ) << endl;
    return 0;
}

输出结果:

Value of word is: again
Value of static_cast< const void * >( word ) is: 0135CC70

地址通常以十六进制(基数为 16)数字形式打印,一般来说,地址的打印方式取决于具体实现。

7.2 使用 put 成员函数输出字符

可以使用 put 成员函数输出字符。例如:

cout.put( 'A' ); // 显示单个字符 A
cout.put( 'A' ).put( '\n' ); // 输出字母 A 后换行

put 函数也可以接受表示 ASCII 值的数值表达式作为参数,例如:

cout.put( 65 ); // 同样输出 A

put 成员函数返回对接收 put 调用的 ostream 对象(如 cout )的引用,因此可以进行链式调用。

8. 流输入

istream 提供了格式化和未格式化的输入能力。流提取运算符( >> )通常会跳过输入流中的空白字符(如空格、制表符和换行符),后续会介绍如何改变这种行为。每次输入后,流提取运算符会返回对接收提取消息的流对象(如 cin 在表达式 cin >> grade 中)的引用。如果将该引用用作条件(如在 while 语句的循环继续条件中),流的重载 void * 转换运算符函数会被隐式调用,根据最后一次输入操作的成功或失败,将引用转换为非空指针值或空指针。非空指针转换为布尔值 true 表示成功,空指针转换为布尔值 false 表示失败。当尝试读取超过流的末尾时,流的重载 void * 转换运算符会返回空指针以表示文件结束。

每个流对象都包含一组状态位,用于控制流的状态(如格式化、设置错误状态等)。这些位由流的重载 void * 转换运算符用于确定是返回非空指针还是空指针。如果输入了错误类型的数据,流提取会设置流的 failbit ;如果操作失败,会设置流的 badbit 。

8.1 get 和 getline 成员函数
  • 无参数的 get 成员函数 :从指定流中输入一个字符(包括空白字符和其他非图形字符,如表示文件结束的键序列),并将其作为函数调用的值返回。当在流中遇到文件结束时,此版本的 get 返回 EOF 。示例代码如下:
#include <iostream>
using namespace std;

int main()
{
    int character; // 使用 int 类型,因为 char 无法表示 EOF
    cout << "Before input, cin.eof() is " << cin.eof() << endl
         << "Enter a sentence followed by end-of-file:" << endl;
    while ((character = cin.get()) != EOF)
    {
        cout.put(character);
    }
    cout << "\nEOF in this system is: " << character << endl;
    cout << "After input of EOF, cin.eof() is " << cin.eof() << endl;
    return 0;
}

该程序首先打印 cin.eof() 的值(即 false ,输出为 0),表示 cin 上尚未发生文件结束。用户输入一行文本,然后按 Enter 键,接着输入文件结束符(在 Microsoft Windows 系统上是 <Ctrl> z ,在 Linux 和 Mac 系统上是 <Ctrl> d )。程序逐字符读取输入并输出,当遇到文件结束符时, while 循环结束,最后显示 cin.eof() 的值(此时为 true ,输出为 1)。
- 带字符引用参数的 get 成员函数 :从输入流中输入下一个字符(即使是空白字符),并将其存储在字符参数中。此版本的 get 返回对调用该成员函数的 istream 对象的引用。
- 三个参数的 get 成员函数 :接受一个 char 类型的内置数组、一个大小限制和一个分隔符(默认值为 '\n' )。该版本从输入流中读取字符,要么读取比指定最大字符数少一个的字符并终止,要么在读取到分隔符时终止。会在用作缓冲区的字符数组中插入一个空字符来终止输入字符串。分隔符不会放入字符数组,但会留在输入流中(分隔符将是下一次读取的下一个字符)。因此,连续两次调用 get 的结果可能是一个空行,除非从输入流中移除分隔符(可能使用 cin.ignore() )。

下面对比使用 cin 和 cin.get 进行输入的示例代码:

#include <iostream>
using namespace std;

int main()
{
    const int SIZE = 80;
    char buffer1[SIZE];
    char buffer2[SIZE];
    cout << "Enter a sentence:" << endl;
    cin >> buffer1;
    cout << "\nThe string read with cin was:" << endl
         << buffer1 << endl << endl;
    cin.get(buffer2, SIZE);
    cout << "The string read with cin.get was:" << endl 
         << buffer2 << endl;
    return 0;
}

cin 读取字符直到遇到空白字符,而 cin.get 会读取空白字符。

  • getline 成员函数 :与三个参数的 get 成员函数操作类似,会在 char 类型的内置数组中的行后面插入一个空字符。 getline 函数会从流中移除分隔符(即读取该字符并丢弃它),但不会将其存储在字符数组中。示例代码如下:
#include <iostream>
using namespace std;

int main()
{
    const int SIZE = 80;
    char buffer[SIZE];
    cout << "Enter a line of text:" << endl;
    cin.getline(buffer, SIZE);
    cout << "The line you entered is: " << buffer << endl;
    return 0;
}
总结

本文详细介绍了 C++ 中流输入输出的相关知识,涵盖了流的基本概念、经典流与标准流的区别、 iostream 库头文件、流输入输出类和对象、标准流对象、文件处理模板、流输出和流输入等方面。通过具体的代码示例展示了各种输入输出操作的使用方法,包括如何处理不同类型的数据、如何控制输出格式、如何处理文件输入输出以及如何处理输入流中的特殊情况等。掌握这些知识对于编写高效、可靠的 C++ 程序至关重要。

以下是 C++ 流输入输出相关操作的总结表格:
| 操作类型 | 相关对象/函数 | 功能描述 |
| ---- | ---- | ---- |
| 标准流对象 | cin | 连接到标准输入设备,用于输入数据 |
| | cout | 连接到标准输出设备,用于输出数据 |
| | cerr | 连接到标准错误设备,无缓冲输出错误信息 |
| | clog | 连接到标准错误设备,有缓冲输出错误信息 |
| 输出操作 | << 运算符 | 流插入运算符,用于输出标准数据类型 |
| | put 成员函数 | 输出单个字符 |
| | write 成员函数 | 进行未格式化输出 |
| 输入操作 | >> 运算符 | 流提取运算符,用于输入基本数据类型 |
| | get 成员函数 | 输入字符,有不同的重载版本 |
| | getline 成员函数 | 输入一行文本 |
| 文件处理 | ifstream | 从文件中进行字符输入 |
| | ofstream | 向文件中进行字符输出 |
| | fstream | 进行文件的输入和输出 |

整个流输入输出的操作流程可以用以下 mermaid 流程图表示:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A([开始]):::startend --> B(初始化流对象):::process
    B --> C{选择操作类型}:::process
    C -->|输出| D(选择输出方式):::process
    D -->|流插入运算符| E(输出标准数据类型):::process
    D -->|put 函数| F(输出字符):::process
    D -->|write 函数| G(未格式化输出):::process
    C -->|输入| H(选择输入方式):::process
    H -->|流提取运算符| I(输入基本数据类型):::process
    H -->|get 函数| J(输入字符):::process
    H -->|getline 函数| K(输入一行文本):::process
    C -->|文件处理| L(选择文件操作类型):::process
    L -->|读取文件| M(使用 ifstream 输入):::process
    L -->|写入文件| N(使用 ofstream 输出):::process
    L -->|读写文件| O(使用 fstream 操作):::process
    E --> P([结束]):::startend
    F --> P
    G --> P
    I --> P
    J --> P
    K --> P
    M --> P
    N --> P
    O --> P

通过上述内容,希望读者能够对 C++ 流输入输出有更深入的理解和掌握,能够在实际编程中灵活运用这些知识来实现各种输入输出需求。

相关推荐

深入解析CEL-CPP:安全高效的C++表达式引擎实战指南

表达式语言是处理动态业务逻辑和配置的核心技术,它允许系统在不修改核心代码的情况下,通过解析和执行字符串形式的逻辑来改变行为。其原理在于将字符串转换为抽象语法树进行安全求值,关键在于平衡表达能力和执行安全性。这项技术的价值在于极大地提升了系统的灵活性和可维护性,实现了声明式配置与动态策略。其应用场景广泛,包括云原生策略授权、游戏技能系统、数据过滤以及工作流条件判断等。本文聚焦于Google开源的CEL-CPP,这是一个专注于**安全沙箱**和**类型安全**的C++表达式引擎实现,它通过**非图灵完备**的设

weixin_30086969的博客 348

70-异常处理深度解析

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。 测试环境:Ubuntu 10.10 GCC版本:9.2.0 一、异常处理深度解析 1)问题 如果在main函数中抛出异常会发生什么? 2)如果异常不处理,最后会传到哪里? 3)下面的代码输出什么? 编程实验 异常的最终处理? E1-1.cpp #include <iostream> using namespace std; class Test { ...

第一大剑豪——索隆 1985

Whisper.cpp深度解析:C/C++离线语音识别引擎原理与工程实践

语音识别作为人机交互核心能力,其边缘部署长期受限于Python生态的启动开销、内存不可控和依赖复杂等问题。Whisper.cpp通过纯C/C++重实现推理流水线,结合ggml张量库与混合量化技术,实现了低延迟、确定性内存占用和跨平台离线运行。它不依赖Python或GPU,支持ARM/RISC-V等嵌入式架构,适用于智能硬件、车载语音、会议记录等对实时性与可靠性要求严苛的场景。本文围绕C/C++实现、离线运行、嵌入式友好三大关键词,系统剖析其设计哲学、编译调优、流式处理及量产级稳定性保障机制。

weixin_33871366的博客 339

Code Llama 70B代码生成能力深度解析:开源模型如何逼近GPT-4

代码大模型正从通用智能走向专业纵深,Code Llama 70B作为当前开源代码生成的标杆,其能力本质源于长上下文建模、代码专属Tokenizer、RLHF对齐与量化推理优化四大技术支柱。它并非简单放大参数,而是在64K上下文窗口下实现跨文件引用召回率94.7%、单元测试边界覆盖率达89%等可测指标,显著提升编译通过率与调试建议有效性。相比GPT-4,它在API集成、SQL优化、错误诊断等垂直场景已实现局部反超,但在多文件架构设计和跨技术栈胶水代码上仍存差距。本文聚焦工程落地视角,解析其性能逼近临界点的技术

mxdxm8899的专栏 538

llama.cpp CPU与GPU推理性能差异深度解析

llama.cpp 是基于 GGUF 格式实现本地大模型推理的轻量级引擎,其核心价值在于跨平台、低依赖、高可控性。它通过 ggml 引擎抽象硬件后端,支持 CPU(AVX/ARM)、CUDA、Metal、DirectML 等多种计算路径,但不同后端在数值精度、内存带宽占用、PCIe 数据搬运效率上存在本质差异。CPU 模式以高确定性和低延迟见长,适合小模型或对输出质量敏感场景;GPU 模式虽提升吞吐,却易因量化误差、显存瓶颈或驱动兼容问题导致响应失真。真正高效的方案是 CPU+GPU 混合卸载——将计算密集

hideto 508

深度解析:利用人工势场法进行机器人编队控制的C++实现

人工势场法的核心思想是通过构造虚拟势场来引导机器人的运动。势场由吸引力场和排斥力场组成,吸引力场将机器人引导至目标位置,排斥力场则避免机器人与障碍物及其他机器人发生碰撞。在机器人编队控制中,还需要引入队形保持力,确保机器人之间保持合理的相对位置。本文详细介绍了利用人工势场法进行路径规划的C++实现方法,并结合Matlab Simulink进行了仿真验证。通过这种方法,机器人能够在二维环境中找到一条从起点到目标点的最优路径,并有效地避开障碍物。希望这篇文章能够为C++开发者在路径规划领域的研究和应用提供帮助。

m0_57781768的博客 1144

LLaMA、llama.cpp与Ollama:从模型到本地化部署的完整指南

本文全面解析了LLaMA大语言模型家族及其本地化部署方案。详细介绍了Meta开源的LLaMA模型作为基础,llama.cpp如何通过C++实现和量化技术实现模型轻量化,以及Ollama如何提供一键式部署与管理,大幅降低本地运行AI模型的门槛,并提供了从入门到进阶的实践指南。

yhn4567890的博客 2398

llama.cpp tools深度解析:量化、压测与并发性能调优实战

GGUF格式是llama.cpp推理生态的核心容器,其模型量化与性能验证高度依赖原生C++工具链。quantize工具通过分组量化(如Q4_K_M)在精度、显存与延迟间实现工程平衡;llama-bench以硬件级参数(--gpu-layers、--flash-attn)精准定位GPU kernel与内存带宽瓶颈;llama-batched-bench则模拟真实服务负载,暴露多并发下的KV缓存竞争与显存带宽天花板。这些工具共同构成从模型瘦身到生产压测的闭环能力,尤其适用于Windows 11 CUDA部署、S

weixin_33720078的博客 348

llama.cpp tools目录深度解析:量化、压测与诊断工程实践

GGUF模型部署不是简单加载文件,而是涉及量化压缩、单请求性能基准测试和高并发压力验证的完整工程闭环。量化工具(quantize)通过AWQ变体实现精度可控的INT4转换,直接影响CPU端7B模型能否在8GB内存设备运行;llama-bench提供毫秒级分解计时,精准定位token生成中的cuBLAS计算瓶颈或CPU分词延迟;llama-batched-bench则模拟真实API并发场景,暴露KV cache碎片化、OOM边界等服务端特有风险。这些能力共同构成llama.cpp生产落地的核心技术支撑,广泛应

weixin_33778544的博客 372

C语言与C++的核心区别及深度解析

C语言与C++的核心区别源于设计理念的差异:C语言是面向过程的结构化语言,追求高效、简洁,专注于底层编程和线性任务;C++是兼容C语言的面向对象语言,在高效性基础上,通过类、继承、多态、STL等特性支持复杂系统开发,兼顾灵活性与扩展性。选择哪种语言需根据应用场景决定:底层开发、资源受限场景优先C语言;大型软件、复杂系统、需代码复用和扩展的场景优先C++。两者并非对立关系,C++可兼容C语言代码,很多项目会混合使用两种语言,发挥各自优势。

2202_75382767的博客 1392

Unity IL2CPP逆向实战:Cpp2IL工具原理与逆向分析全解析

在软件逆向工程领域,理解编译后程序的内部逻辑是安全分析、漏洞挖掘和竞品研究的基础。传统.NET程序可通过中间语言(IL)进行反编译分析,但Unity引擎的IL2CPP技术将C#代码编译为C++并进一步优化为原生机器码,导致符号信息和代码结构严重丢失,形成逆向分析的“黑盒”。Cpp2IL作为专门针对IL2CPP的逆向工具,通过解析global-metadata.dat元数据文件和游戏二进制文件,重建出可读的IL代码和类型系统,其核心价值在于突破了IL2CPP的逆向壁垒。该工具在游戏安全审计、外挂原理分析、协议

weixin_34306593的博客 449

C++11内存池设计与实现深度解析

这里是因为直接调用默认拷贝构造会出现问题,因此重写拷贝构造的接口,实际上用的是委托的默认构造函数,这样即使不小心调用了拷贝构造,最后实际上执行的仍是默认构造,从而避免出现因浅拷贝而出现的问题。这里借助通俗的模型帮助大家理解内存池是怎么运作的。假设我们有一个快递站(内存池),里面有很多货架(Block),每个货架有很多格子(Slot)用于存放快递(要存储的对象),这里假设所有快递占用的空间一样。注意:一个内存池有很多个内存块(block),一个内存块有多个内存槽(slot),内存槽一般就可以用来存储对象。

qq_56402998的博客 1176

智能车竞赛模糊PID代码与使用方法

本文给出了模糊PID的代码,以及模糊PID的程序使用方法、参数调整方法

piginthesouth的博客 9122

【3】Ubuntu18.04下载与安装,以及中文输入法的安装

Ubuntu18.04下载与安装一、下载二、安装(在VMware 16 pro中安装Ubuntu18.04)三、Ubuntu中安装中文输入法1.检查 fcitx 框架2.安装输入法 一、下载 下载地址:Ubuntu Releases 往下拉,找到自己需要的安装版本(建议不要安装最新版,因为你在使用时候遇到的错误大多都是以前版本的,最新版本的,解决方案特别少) 我这里安装的是Ubuntu18.04 一般都是使用desktop版本的(desktop版和server版本的区别:请看这篇文章) 之后点击下载即

斯基的朦胧 1万+

AXI4接口说明

ACLK:全局AXI接口时钟输入(建议与系统时钟保持一致)ARESET_n:全局AXI接口复位信号,低电平有效。PS:在HBM AXI接口应用中,此复位端口仅应在数据传输开始前使用。若在传输开始后使用,会导致AXI接口与内存控制器失步(out-of-sync)。当开关启用时,IP核会将所有ARESET_n引脚内部连接在一起——因为内存作为一个整体工作。

rhtul的博客 1521

〖进阶篇1〗YAML参数解析:从nav2_params.yaml看机器人导航调优

本文深入解析了ROS2 Nav2导航系统中关键的nav2_params.yaml文件,提供了从定位、行为树、运动控制到环境感知等核心模块的参数调优实战指南。文章通过具体场景案例,如狭窄走廊、动态仓库和高精度对接,详细阐述了如何调整AMCL粒子数、控制器权重、代价地图膨胀半径等参数,以解决机器人导航中的犹豫、碰撞和精度问题,帮助开发者实现从“能用”到“好用”的进阶。

m9n0o的博客 417

Flotherm XT新手必看:5分钟搞定自然对流热仿真(附案例文件)

本文为Flotherm XT新手提供了自然对流热仿真的快速入门指南,通过详细的步骤解析和实用技巧,帮助用户在5分钟内完成从建模到后处理的全流程。重点介绍了环境设置、几何建模、材料属性、网格划分等关键环节,并附有案例文件供参考学习,助力工程师快速掌握热仿真技术。

weixin_30839881的博客 610

人员行为规范检测:YOLOv8+C#实现工厂车间安全监控,违规即报警零延迟

该方案通过YOLOv8的装备检测与姿态估计的动作识别,结合C#的实时管控能力,实现了从“被动巡检”到“主动预警”的转变。相比传统人工,违规响应速度提升10倍,全年可减少90%以上的安全隐患。方案已在3家制造企业落地,支持自定义违规规则(如新增“吸烟”“未系安全带”),可根据车间场景灵活扩展。需要完整的模型训练配置文件(含数据集增强脚本)或C#系统源码(视频处理+报警模块)的,评论区扣“SafetyDetect”,可直接获取部署版本~

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1174

HFSS实战项目——微带一分四功分器

呕心沥血保姆级教程!!!!手把手教会你做功分器,史上最详细步骤!!!

2401_87464239的博客 2672

NeRF-Pytorch(训练自己的数据集过程全记录+环境配置+COLMAP+问题解决)

写于2025/1/26,在用NeRF训练自己的数据集过程中该踩的坑都踩过了,发现网上并没有详细完整写这些问题解决过程的帖子,遂自己进行一个全记录和复盘。 整篇文章包括:NeRF训练环境配置;COLMAP三维重建过程(直接给出代码,规避一些bug);在训练时候出现的问题。 本篇文章仅针对llff格式数据集。

m0_62577716的博客 1773

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 33、工业系统分布式控制与滤波实验研究
下一篇: 33、扩展系统功能:别名、函数与脚本使用全解析
zero1
博客等级 码龄24年 951粉丝 1198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值