看了 std::ifstream.read() 的源码,问个问题

unhappyless 2008-09-12 05:37:16

// A height for each vertex
std::vector<BYTE> in( _numVertices );

std::ifstream inFile(fileName.c_str(), std::ios_base::binary);

if( inFile == 0 )
return false;

inFile.read(
(char*)&in[0], // buffer
in.size());// number of bytes to read into buffer

inFile.close();


对read() 转定义后到
	_Myt& __CLR_OR_THIS_CALL read(_Elem *_Str, streamsize _Count)
{
return _Read_s(_Str, (size_t)-1, _Count);
}

关键就是 _Read_s 的第二个参数 (size_t)-1 ,它决定了 _Str指针每次的偏移。 typedef unsigned int size_t
std::vector<BYTE> in( _numVertices );而这里定义的内存空间是用 BYTE 。 typedef unsigned char BYTE

int 和 char 所在字节又不等,这里不会溢出吗?
...全文
499 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
unhappyless 2008-09-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 visame 的回复:]
C/C++ code
basic_istream::_Read_s

Reads a specified number of characters from the stream and stores them in an array.

basic_istream<Elem, Tr>& _Read_s(
char_type *_Str,
size_t _Str_size,
streamsize _Count
);

Parameters

_Str

The array in which to read the characters.
_Str_size

The size of _Str. //显然这里的_Str_size表示_Str的大小
_Count

The nu…
[/Quote]

既然是表示大小,哪也不应该是 (size_t)-1 呀
星羽 2008-09-15
  • 打赏
  • 举报
回复
_Str_size 是目标缓冲的大小,单位是byte
_Count 是需要拷贝(读入)的数据大小

_Str_size 必须大于等于 _Count 否则报错

这个类似于memcpy_s(
void *dest,
size_t numberOfElements,
const void *src,
size_t count
);

里的 numberOfElements 和 count

而_Read_s,在缓冲区有数据的时候,最终会调用 memcpy_s

而 _Str_size 刚好传给 numberOfElements

设成 (size_t)-1
表示不用关心目标缓冲大小(暗示缓冲一定够大以存在读入数据)
星羽 2008-09-15
  • 打赏
  • 举报
回复
设成 (size_t)-1
表示不用关心目标缓冲大小(暗示缓冲一定够大以存在读入数据)
星羽 2008-09-15
  • 打赏
  • 举报
回复
_Str_size 是目标缓冲的代码,单位是byte
_Count 是需要拷贝(读入)的元素个数

_Str_size 必须大于等于 _Count 否则报错

这个类似于memcpy_s(
void *dest,
size_t numberOfElements,
const void *src,
size_t count
);

里的 numberOfElements 和 count

而_Read_s,在缓冲区有数据的时候,最终会调用 memcpy_s

而 _Str_size 刚好传给 numberOfElements
visame 2008-09-14
  • 打赏
  • 举报
回复

basic_istream::_Read_s

Reads a specified number of characters from the stream and stores them in an array.

basic_istream<Elem, Tr>& _Read_s(
char_type *_Str,
size_t _Str_size,
streamsize _Count
);

Parameters

_Str

The array in which to read the characters.
_Str_size

The size of _Str. //显然这里的_Str_size表示_Str的大小
_Count

The number of characters to read.

// basic_istream__Read_s.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

int main()
{
const int c_size = 10;
char c[c_size];
int count = 5;

cout << "Type 'abcde': ";

cin._Read_s(&c[0], c_size, count);
c[count] = 0;

cout << c << endl;
}

帅得不敢出门 2008-09-14
  • 打赏
  • 举报
回复
貌似 (size_t)-1很大.
unhappyless 2008-09-13
  • 打赏
  • 举报
回复
那读取步长为什么是(size_t)-1 ?
zhuwanglove 2008-09-12
  • 打赏
  • 举报
回复
(size_t-1),读取的步长哦,字节数还是_count,不是(size_t-1)*_count .
不知是否对?
xkyx_cn 2008-09-12
  • 打赏
  • 举报
回复
_Count才是需要读入的字节数
源码免费下载链接】:https://renmaiwang.cn/s/f5jsx 在C++编程中,将文件转换为二进制和从二进制还原文件是一项常见的任务,特别是在处理图像、音频、视频和其他数据时。这个过程涉及到读取文件内容并将其存储为二进制数据,以及从二进制数据中恢复原始文件。在VS2010环境下,我们可以使用C++的标准库``来完成这一操作。以下是对这个主题的详细解释:让我们了解什么是文件和二进制数据。在计算机中,所有的数据最终都是以二进制形式存在的,即0和1的序列。当我们说“文件”,通常指的是文本文件或二进制文件。文本文件包含可读的字符,如ASCII或Unicode编码,而二进制文件则包含任何类型的数据,包括图像、音频等。### 文件转二进制将文件转换为二进制,主要是读取文件的每个字节,并将它们保存到一个二进制流中。以下是基本步骤:1. **打开文件**:使用`std::ifstream`类打开要转换的文件,设置模式为`std::ios_base::binary`以进行二进制读取。2. **读取数据**:使用`read()`函数从文件中读取字节,并存储到缓冲区或内存中的适当结构中。3. **关闭文件**:完成读取后,用`close()`函数关闭文件。以下是一个简单的示例代码片段:```cpp#include #include std::vector readFileToBinary(const std::string& filePath) { std::ifstream file(filePath, std::ios::binary | std::ios::ate); if (!file.is_open()) { throw std::runtime_error("Failed to open file");
源码免费下载链接】:https://renmaiwang.cn/s/zk7kp 在C++编程中,作为程序设计中的一个重要方面,在处理文本文件这一任务上被认为是一个典型的应用场景。具体而言,我们通过封装实现对TXT文件的读取与处理功能。其中,我们利用了C++类特性的优势,结合标准库中的`std::string`、`std::vector`以及指针操作来完成数据处理任务。 在具体实现中,支持高效的字符串拼接、定位与修改。每个文件行包含三个文本字段,并通过`std::vector<std::string>`实现对每一行数据的统一管理。在此基础上,我们定义了一个名为`TextFileProcessor`的用户自定义类型,其中包括私有成员用于存储文件信息以及公有的操作功能。 在代码实现中,“openFile”函数主要负责打开并验证文件路径的有效性;“readData”函数则通过逐行读取文本内容来完成数据加载;而“processData”函数则根据需求对处理后的数据进行进一步的分析与操作。其中,`std::vector<std::string>`不仅支持动态扩展,还能提供高效的随机访问特性。 此外,在类的具体实现中,“TextFileProcessor”通常会使用`std::ifstream`来管理文件打开过程,并通过`std::stringstream`对每一行文本进行分割处理。对于需要的字段操作,我们则可以利用指针技术来确保内存的安全性与稳定性。 最后,通过这种封装设计,在实际应用中能够显著提升代码的可维护性和扩展性。

65,207

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧