2 wjj1991 wjj1991 于 2016.03.05 01:29 提问

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的结果一样?

3个回答

caozhy
caozhy   Ds   Rxr 2016.03.05 06:06

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

wjj1991
wjj1991 上面的例子这也是这样写的
接近 2 年之前 回复
wjj1991
wjj1991 http://www.cplusplus.com/reference/istream/istream/read/
接近 2 年之前 回复
WinsenJiansbomber
WinsenJiansbomber   2016.03.05 12:47

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

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

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

WinsenJiansbomber
WinsenJiansbomber 回复wjj1991: 另外提醒一下,你漏掉cpp.com上的例中最重要的一句:is.seekg (0, is.beg);
接近 2 年之前 回复
WinsenJiansbomber
WinsenJiansbomber 回复wjj1991: 况且每个程序有各自的运算情境,不见得照抄过来就用得上。
接近 2 年之前 回复
WinsenJiansbomber
WinsenJiansbomber 回复wjj1991: 不要人家怎么抄你就怎么抄吧,能抄点有水平的不?
接近 2 年之前 回复
wjj1991
wjj1991 Thank you... 不过长度,http://www.cplusplus.com/reference/istream/istream/read/上面的例子也是这样用的。。
接近 2 年之前 回复
wjj1991
wjj1991   2016.03.05 14:09
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;

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!