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

问题描述

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

iftream-c++ ifstream read 与 getline 方法获取到的结果不一样的相关文章

在Python中用get()方法获取字典键值的教程

  这篇文章主要介绍了在Python中用get()方法获取字典键值的教程,是Python入门中的基础知识,需要的朋友可以参考下 get()方法返回给定键的值.如果键不可用,则返回默认值None. 语法 以下是get()方法的语法: ? 1 dict.get(key, default=None) 参数 key -- 这是要搜索在字典中的键. default -- 这是要返回键不存在的的情况下默认值. 返回值 该方法返回一个给定键的值.如果键不可用,则返回默认值为None. 例子 下面的例子显示了g

java-如何在页面调用一个方法获取它的值

问题描述 如何在页面调用一个方法获取它的值 <%String strid = request.getParameter(""id"");String giftid=new String(request.getParameter(""id""));System.out.println(strid);int gid=Integer.parseInt(strid);System.out.println(gid);Gift gt

C/C++多种方法获取文件大小

C/C++多种方法获取文件大小 #include <iostream> #include <io.h> #include <sys\stat.h> #include <afx.h> #define _AFXDLL using namespace std; void main() { // 此文件在工程打开状态下为不可访问 char* filepath = "..\\test.ncb"; // 方法一 struct _stat info;

JQuery使用index方法获取Jquery对象数组下标的方法

  本文实例讲述了JQuery使用index方法获取Jquery对象数组下标的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

JS使用ajax方法获取指定url的head信息中指定字段值的方法

 这篇文章主要介绍了JS使用ajax方法获取指定url的head信息中指定字段值的方法,实例分析了Ajax操作URL中head信息的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JS使用ajax方法获取指定url的head信息中指定字段值的方法.分享给大家供大家参考.具体分析如下: 下面的JS代码用来获取ajax_info.txt的head信息中的Last modified属性,最后修改时间 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1

jQuery.position()方法获取不到值的安全替换方法

 这篇文章主要介绍了jQuery.position()方法获取不到值的安全替换方法,本文给出了一种变通的方法,用.offset()来换算,需要的朋友可以参考下     调用jQuery.position()方法会返回相对于父元素的位置,jQuery官方文档中描述说,它跟.offset()方法不一样,.offset()返回的是相对于document的位置,而.position()返回的是相对于父元素的位置. 但事实上,在使用的过程中,我们发现.position()返回的值经常是0.但事实不是0.尤

使用jquery中height()方法获取各种高度大全

 这篇文章主要介绍了使用jquery中height()方法获取各种高度大全,比如浏览器高度.可视窗口高度.文档高度等,需要的朋友可以参考下    代码如下: alert($(window).height()); //浏览器当前窗口可视区域高度   alert($(document).height()); //浏览器当前窗口文档的高度   alert($(document.body).height());//浏览器当前窗口文档body的高度   alert($(document.body).out

c++-为什么getline总是获取不到第一单词呢

问题描述 为什么getline总是获取不到第一单词呢 求学霸帮帮忙 解决方案 因为这句的原因istream_iterator in_vec(in_2); 楼主不信可以注释掉试试,一定能读到第一个单词 原因的话: 你将迭代器用in_2初始化以后其实指针是指向第一个单词的尾部(这点楼主应该知道吧,就像迭代器到end了以后,其实是指向最后一个元素的后面一样),然后再用getline读是读不到第一个单词的 解决方案二: 前面加个打开文件的判断.是不是文件打开失败造成了句柄没有关联

http协议-http用GET方法获取重定向网址源码

问题描述 http用GET方法获取重定向网址源码 类似天猫商品的网址以GET方法获取的是301. (1)断开程序,截取其中的Location继续GET仍然是301,多次运行,多次截取上一次返回的Location最终会返回200 OK (2)若采用自动截取,循环方法GET无法得到200 OK. 采用截取上次返回的location获取重定向后的网址思路对吗?为什么采用循环GET无法得到200OK?源码附上,谢谢指点. #include<string.h> #include<sys/types