c++ ifstream read 与 getline 方法获取到的结果不一样

同一个文件,不同方法结果不一样

第1种写法:

  std::ifstream in("midfile.mid");

  in.seekg(0,std::ios::end);
    const int length = in.tellg();
    char* buffer = new char[length];

    in.read(buffer, length);
    in.close();
    std::cout << std::hex << buffer[0];
    delete buffer;

断点显示buffer[0] -51

第2种写法:

std::ifstream in("midfile.mid");

char buffer[256];
while (!in.eof())
{
    in.getline(buffer, 100);
    std::cout << std::hex <<buffer[0];
    break;
}
in.close();

断点显示buffer[0] 77

求问,getline 与 read 有什么不同么?怎么让read到的与getline的结果一样?

const int length = in.tellg();
返回的不是长度,而是当前文件指针的位置

in.seekg(0,std::ios::end);都把内部指针指向文件结束点了,再read能取出什么内容呢?

seekp 和 tellp ,seekg and tellg ,后缀p代表put输出,后缀g代表get是输入,对应两套文件IO方法,内部管理了一个指向当前位置的指针,通过seek来改变指针的位。

如果想通过 tellp 、tellg来间接获取文件长度,需要文件开始处的指针值和结束处的指针值,两个值的差值就表示内存中的字节数。

std::ifstream in("midfile.mid");

in.seekg(0,std::ios::end);
    in.seekg(0,std::beg);//加上这句就正常了
const int length = in.tellg();
char* buffer = new char[length];

in.read(buffer, length);
in.close();
std::cout << std::hex << buffer[0];
delete buffer;