问题描述
- 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的结果一样?
解决方案
in.seekg(0,std::ios::end);都把内部指针指向文件结束点了,再read能取出什么内容呢?
seekp 和 tellp ,seekg and tellg ,后缀p代表put输出,后缀g代表get是输入,对应两套文件IO方法,内部管理了一个指向当前位置的指针,通过seek来改变指针的位。
如果想通过 tellp 、tellg来间接获取文件长度,需要文件开始处的指针值和结束处的指针值,两个值的差值就表示内存中的字节数。
解决方案二:
const int length = in.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;
时间: 2024-09-20 13:53:45