首页 > 解决方案 > 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);

在这里,我如何访问数组元素?

标签: c++arrayspointersreferenceimplicit-conversion

解决方案


成员函数 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] );

但在这种情况下,您将无法将指针传递给动态分配的数组或数组的一部分。


推荐阅读