`

stl::string与二进制数据

    博客分类:
  • c++
阅读更多
C99 有很多和 string 相关的函数,如 strcat , strchr , strcmp , strcpy , strlen , strncat , strncmp , strncpy 等。然而使用 C++ 编程时,所有和 string 相关的操作均可以使用 string 类的相关接口完成, string 提供和原来 C 接口类似的功能和性能,同时提供更高的安全性。 

String 类有一个特性: a string of length n must manage a block of memory whose size is at least n + 1 。即长度为 n 的 string 对象,其内存空间至少为 n+1 个字符,且最后一个字符为 ’\0’ 。 

不过在进行 string 操作时,有一点必须牢记: C/C++ 语言的 string 是以 ’\0’ 结尾的,对不以 ’\0’ 结尾的 string 进行操作容易引发错误,甚至导致内存溢出等 crash 。 

C++ 的 string 类,除了用于处理常规 string 操作 外,其本身也可用于存储各种数据 ,如文件数据,此时并不要求 string 对象必须以 ’\0’ 结尾。使用者采用 string( const char* str, size_type length ); 来封装特定长度的 char* 数据块。 String 类的各种运算符将保证数据传递的完整性,即 string 对象。 

示例: 

view sourceprint?
01 #include <iostream>  

02 using namespace std;  

03    

04 int main() {  

05         std::string str("test string");  

06         cout<<str<<"  "<<str.c_str()<<endl;  

07         cout<<str.size()<<endl;  

08    

09         char* buf = new char[str.size()+1];  

10         memset(buf, 0, sizeof(str.size()+1));  

11    

12         string test(buf, str.size());   // 封装非字符数据  

13         cout<<test<<"  "<<test.c_str()<<endl;  

14         cout<<test.size()<<endl;  

15    

16         memcpy(buf, str.c_str(), str.size());  

17    

18         test = string(buf, str.size());   // 封装字符数据,并自动加上 ’\0’ 结束符  

19         cout<<test<<"  "<<test.c_str()<<endl;  

20         cout<<test.size()<<endl;  

21    

22         return 0;  

23 } 
其输出:

test string  test string 

11 

  

11 

test string  test string 

11 

说明:这个例子说明:当使用 string( const char* str, size_type length ); 来构造string对象时,string对象的长度由外部指定,数据则来自 str ,如果 length 大于 str 地址范围,可能引发 crash! 

这个例子也说明了 string 可用于封装数据,即使是 ’\0’ 的数据。因此,string类可以用于存储各种数据,字符串、非字符串 (图片,视频)等数据。 

注意:将数据拷贝到内存时,不要使用strcpy, 应该使用memcpy,因为strcpy、strncpy碰到 ’\0’ 将认为拷贝结束。 总之,不要使用和str*** 相关的函数去操作内存数据,除非数据只能是string(memcpy完全可拷贝任何数据) 。

分享到:
评论

相关推荐

    C++实现string存取二进制数据的方法

    然而,在处理二进制数据时,需要注意string类的一些特性,因为它通常与文本字符串关联,而二进制数据可能包含特殊的字符,如空字符('\0'),这可能导致意外的结果。本文将探讨如何在C++中利用string类存储和提取二...

    20120930_用string存取二进制数据1

    在本文中,我们将探讨如何使用 C++ 的 STL(Standard Template Library)中的 `std::string` 类型来存储和操作二进制数据,并讨论其潜在的问题和解决方案。 首先,`std::string` 是 C++ 标准库中用于处理文本字符串...

    std::string format格式化函数源代码及两种格式化方法

    `debug`目录通常包含编译后的调试版本的二进制文件,而`string_format`可能是编译生成的可执行文件或库文件。 总的来说,这个项目提供了一个自定义的`std::string format`函数,用于简化C++中的字符串格式化操作。...

    c# 解析二进制.stl模型

    STL(STereo Lithography)...通过这个C#解析二进制STL模型的示例,你可以创建自己的3D模型读取器,从而在各种项目中灵活地处理3D几何数据。注意,在实际应用中,你可能还需要考虑错误处理、内存优化和性能提升等细节。

    C#提取二进制STL文件并生成TXT文件

    这个任务涉及的是使用C#编程语言从二进制STL文件中提取数据,并将其转换为TXT文本文件。下面我们将详细探讨这个过程中的关键知识点。 首先,STL文件主要存储3D模型的表面信息,由一系列的三角面片构成,每个面片...

    MFC基于对话框的二进制与十六进制间转换.rar.rar

    MFC基于对话框的二进制与十六进制间转换是一个常见的编程任务,尤其对于那些处理底层数据或者进行二进制文件操作的应用程序。下面将详细阐述这一主题的相关知识点。 首先,我们需要了解二进制和十六进制。二进制是...

    c++ STL string学习资料

    ASCII编码是早期的字符编码方式,用7位二进制表示128个字符;而Unicode,特别是UTF-8编码,能表示全球几乎所有的字符,它是现代软件中广泛使用的编码格式。在C++中,`std::string`默认采用UTF-8编码,但处理字符串时...

    读取STL文件数据并保存去重后的点的信息以及面片信息

    对于大量数据,二进制STL文件的读写速度会更快。要处理二进制STL,可以使用`std::ios_base::binary`标志,并直接读写内存块,而不是逐行解析。 总结,通过C++的文件流和STL库,我们可以实现读取STL文件、存储点和...

    STL_File.zip_STL_reading_stl reader

    总结来说,"STL_File_reader"是一个用C++编写的库,用于读取和解析STL文件,支持二进制和ASCII格式,包含文件读取、数据解析、错误处理和数据访问等功能。它对于处理3D几何数据,尤其是在3D打印和CAD领域,具有重要...

    STL指南

    - `bitset`: 位集类,用于高效地存储和操作二进制数据。 - `Map`, `Multimap`: 关联容器,`Map`是键值对的唯一映射,`Multimap`则允许键的多重映射。 - `hash_map`: 不是C++标准库的一部分,但在某些实现中(如...

    STL实现的数据结构部分算法

    进制转换涉及到将一个数字从一种进制表示转换为另一种进制表示,例如十进制转二进制或十六进制等。 - **代码解析(假设)**: - 使用`#include&lt;stack&gt;`引入堆栈容器。 - 用户输入原数字`m`和目标进制`n`。 - ...

    STL的使用,文件的读取和改变格式

    当我们谈论“改变格式”,这可能指的是将文件数据从一种格式转换为另一种,比如从文本到二进制,或者从CSV到JSON。这通常需要自定义的处理逻辑,因为每种格式都有其特定的结构。例如,如果你有一个CSV文件,你可以...

    【STL源代码】C++标准库STL源代码下载

    - `bitset`:位集,用于高效地处理二进制数据,常用于表示一组布尔值。 - `functional`:包含各种函数对象,如`bind1st`、`bind2nd`、`ptr_fun`等,用于函数对象的创建和操作。 4. 其他: - `stl_algo.h`:包含...

    c++编写的ip地址转换

    转换过程通常包括两个步骤:字符串到二进制和二进制到字符串。 1. **字符串到二进制**: - 使用`inet_aton()`函数可以将点分十进制的IP地址转换为二进制。例如: ```cpp struct in_addr ip_binary; if (inet_...

    C++ BASE64 编解码

    此外,还可以使用位运算(如位移和位与)来处理二进制数据。 在提供的cpp-base64-master文件中,可能包含以下内容: - 主要的源代码文件,如base64.h和base64.cpp,其中定义了Base64编码和解码的函数。 - 示例代码...

    STL文件的读取(普通文件解析与内存映射文件解析) cpp&stl

    二进制STL文件的每个面片占用50个字节,而ASCII STl文件则使用更直观的文本表示,但存储效率较低。 普通文件解析通常涉及打开文件,逐行或逐字节读取,然后根据STL文件格式解析数据。以下是一个简单的C++代码示例,...

    opengl读取stl文件

    - **二进制文件读取**:对于二进制格式的STL文件,需要按照规定的字节数读取文件,并解析出三角面片的相关信息。 #### 四、OpenGL中的三角面片绘制 - **OpenGL基础知识**:OpenGL是一种跨语言、跨平台的应用程序...

    初赛知识点的整理和总结

    1. **二进制**:由0和1组成,通常用于计算机内部数据存储和处理。 2. **八进制**:由0至7组成,在早期的计算机系统中较为常见。 3. **十进制**:我们日常生活中的计数方式,由0至9组成。 4. **十六进制**:由0至9和A...

    C语言数据结构哈夫曼树的实现

    - `decode(string, string)`:根据编码表对二进制码流进行解码。 在提供的压缩包文件`huafman`中,可能包含了实现这些功能的源代码文件,如`huffman_tree.c`或`huffman_tree.cpp`。通过对这些文件的阅读和学习,你...

Global site tag (gtag.js) - Google Analytics