c++ - C++ ifstream::read 混淆
问题描述
我想遍历文件流的字节。我正在使用 ifstream 类。当您使用 read 函数时,它会将字符从流中复制到我在参数列表中指定的数组中。我有 3 个问题。
int length = 1024;
char buff[1024];
ifstream inf(fp, ios::in | ios::binary);
inf.read(buff, length);
我之所以不需要在“buff”之前使用“&”是因为第一个参数不是指针而是引用?
如果我有这个怎么办:
int length = 1024;
vector<char> buffer;
ifstream inf(fp, ios::in | ios::binary);
inf.read(&buff[0], length);
它实际上做的是它获取向量第一个元素的内存地址。只有第一个的地址!但它仍然可以访问整个数组,因为它将字符复制到其中。这怎么可能?同样的事情是否也适用于以下内容?:
int length = 1024;
char* buffer[1024];
ifstream inf(fp, ios::in | ios::binary);
inf.read(&buff[0], length);
在这里,我如何访问数组元素?
解决方案
成员函数 read 声明如下
basic_istream<charT, traits>& read(char_type* s, streamsize n);
它的第一个参数有一个指针类型。
在这次通话中
inf.read(buff, length);
数组 buff 被编译器隐式转换为指向其第一个元素的指针。
所以这个调用等价于调用
inf.read( &buff[0], length);
但最后一个需要更多的打字。
如果你会写
inf.read(&buff, length);
那么参数的类型将是char ( * )[1024]
并且编译器将发出错误,因为参数的类型和参数的类型不同。
至于这个代码片段,当使用向量而不是字符数组时。
int length = 1024;
vector<char> buffer;
ifstream inf(fp, ios::in | ios::binary);
inf.read(&buff[0], length);
那么它是无效的,因为向量是空的。
你应该改写
int length = 1024;
vector<char> buffer( length );
ifstream inf(fp, ios::in | ios::binary);
inf.read(&buff[0], length);
它实际上做的是它获取向量第一个元素的内存地址。只有第一个的地址!但它仍然可以访问整个数组,因为它将字符复制到其中。这怎么可能?
函数的第二个参数指定第一个参数设置的内存地址多大。
例如,该函数可以声明为模板函数
template <size_t N>
basic_istream<charT, traits>& read( char_type ( &s )[N] );
但在这种情况下,您将无法将指针传递给动态分配的数组或数组的一部分。
推荐阅读
- php - 参数类型“String”不能分配给参数类型“Uri”。扑
- performance - Common Lisp:在不使用 &rest 参数的情况下有效地处理提供的 p 参数
- java - 使用 Jackson 将 Tree 转换为 Json 而没有方括号和字段名称
- java - weka 3.8 中的内存不足(堆上小于 50 m)错误消息
- google-apps-script - Google Picker API 禁用提交确认模式窗口
- spring - 石英和任务同时出现的问题
- javascript - 变量的记录方式不同,具体取决于它们是否在 javascript 中通过 onclick 功能传递
- reactjs - React-Router-DOM“精确”路径仅适用于顶级(/)
- mysql - 如何从更新表中获取最新状态并将其与 MySQL 中的详细信息表连接?
- isabelle - 专注于子目标