首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么"gptr"类型为basic_streambuf char_type*而不是const char_type*?

"gptr"类型为basic_streambuf<char_type>而不是const char_type的原因是为了支持读取和修改流缓冲区的指针位置。

在C++中,basic_streambuf是一个模板类,用于管理输入和输出流的缓冲区。它包含了一些成员函数和成员变量,其中之一就是"gptr",它是一个指向缓冲区当前读取位置的指针。

如果"gptr"的类型是const char_type*,那么它将被视为只读指针,只能用于读取缓冲区的内容,而不能修改指针位置。这样的设计会限制流缓冲区的灵活性,无法实现一些需要修改指针位置的操作,比如回退读取或者随机访问。

因此,将"gptr"的类型定义为basic_streambuf<char_type*>,即非常量指针,可以允许对指针位置进行修改。这样一来,开发人员可以根据需要自由地在缓冲区中移动指针,实现更加灵活的流操作。

需要注意的是,由于"gptr"是basic_streambuf的成员,其类型是由basic_streambuf的模板参数char_type决定的。所以具体的类型取决于使用basic_streambuf时传入的char_type类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

探究一下c++标准IO的底层实现(3000字长文)

,put函数是调用了缓冲区基类basic_streambuf的sputc成员函数,sputc成员函数实现如下: int_type sputc(char_type __c) {...注意,这里箭头指示代表使用关系,并不是继承关系,所以我这里用了比较透明的线,后续同理。...filebuf在调用open函数的时候会new一块char类型的动态内存,大小BUFSIZ,BUFSIZ是系统文件里面定义的一个专门用于缓冲区的默认size,filebuf写数据的时候,是先写到这一块动态内存中去...类型的cerr和clog,那么他们为什么又可以直接使用呢。...又是一个软链接,它链接的是/proc/self/fd/1这个文件,/proc/self/fd/1又链接到了/dev/pts/0这个文件,/dev/pts/0这个文件实际上代表的是当前打开的终端,以当前终端

53140
  • fstream读写文件read_使用同一个fstream

    修改fs.open("d://zhou"); fs.open("d://zhou", ios_base::in); ,即只读的方式打开。 运行后,文件依旧不能被创建。...修改fs.open("d://zhou"); fs.open("d://zhou", ios_base::out); ,即只写的方式打开。 运行后,文件在D盘被创建了。...3.2 写文件 write() basic_ostream& write( const char_type* s, std::streamsize count ); 它是继承于ostream类 #include...怎么读一个数据不是只调用read就行吗?怎么多了好几个? 因为… fs.write()是将内容写入缓冲区(内存)。fs.sync() 是为了将缓冲区的内容刷新写入硬盘。...read方法是只能读取硬盘上的内容,读不了缓冲区。 fs.seekg()则是将文件的指针回到开头。当为了写入之后,文件指针指向了末尾了。调用read时候,也就会从末尾读,啥也读不出来。

    1.1K10

    C语言字符串操作总结大全(超详细)

    strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置 0 以根据特定格式判断所用进制,0x, 0X 前缀以解释十六进制格式整型...() 检查是否十六进制数字表示的有效字符 isspace() 检查是否空格类型字符 iscntrl() 检查是否控制字符 ispunct() 检查是否标点符号 isalnum() 检查是否字母和数字...c++概念字符串操作   一、char_traits 字符特征类   1)意义:包装特定串元素的通用行为界面,以便容器实现时依据特征信息执行特定行为   2)定义了通用类型名   typedef _Elem...()   4)int_type 类型应是当前字符类型的整型编码   二、std::string 并不是序列容器,没有 front() 和 back() 界面用于取出前端和尾端的元素,使用 std::string...运算符,可以定义输入流在布尔表达式中的行为,使得当流读取失败的情况下,输入迭代器可以通过布尔表达式来确认,不是显式访问 fail() 成员函数.

    1.8K10

    C++字符串输入函数小结

    参考链接: C++ fgetwc() 做了一些字符串类型的题目,发现在字符串类型的题目中  如何进行输入输出是很重要的,查找资料的过程中看到了这篇博文  觉得写的很好,就给转过来了  以下为正文:  ...原创 http://hi.baidu.com/atomxu 转载请注明出处  看了网上有人写的,不是很全,而且还有几处错误,所以自己重新找了一下MSDN中的相关内容。   ...basic_istream& getline(    char_type *_Str,     streamsize _Count ); basic_istream& getline(    char_type...int scanf(    const char *format [,    argument]...  ); int wscanf(    const wchar_t *format [,    argument...int sscanf(    const char *buffer,    const char *format [,    argument ] ...  ); int swscanf(    const

    82700

    零基础入门C语言超详细的字符串详解

    strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置 0 以根据特定格式判断所用进制,0x, 0X 前缀以解释十六进制格式整型...() 检查是否十六进制数字表示的有效字符 isspace() 检查是否空格类型字符 iscntrl() 检查是否控制字符 ispunct() 检查是否标点符号 isalnum() 检查是否字母和数字...c++概念字符串操作   一、char_traits 字符特征类   1)意义:包装特定串元素的通用行为界面,以便容器实现时依据特征信息执行特定行为   2)定义了通用类型名   typedef _Elem...()   4)int_type 类型应是当前字符类型的整型编码   二、std::string 并不是序列容器,没有 front() 和 back() 界面用于取出前端和尾端的元素,使用 std::string...运算符,可以定义输入流在布尔表达式中的行为,使得当流读取失败的情况下,输入迭代器可以通过布尔表达式来确认,不是显式访问 fail() 成员函数.

    1K20

    C语言字符串操作总结大全(超详细)

    strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置 0 以根据特定格式判断所用进制,0x, 0X 前缀以解释十六进制格式整型...() 检查是否十六进制数字表示的有效字符 isspace() 检查是否空格类型字符 iscntrl() 检查是否控制字符 ispunct() 检查是否标点符号 isalnum() 检查是否字母和数字...c++概念字符串操作   一、char_traits 字符特征类   1)意义:包装特定串元素的通用行为界面,以便容器实现时依据特征信息执行特定行为   2)定义了通用类型名   typedef _Elem...()   4)int_type 类型应是当前字符类型的整型编码   二、std::string 并不是序列容器,没有 front() 和 back() 界面用于取出前端和尾端的元素,使用 std::string...运算符,可以定义输入流在布尔表达式中的行为,使得当流读取失败的情况下,输入迭代器可以通过布尔表达式来确认,不是显式访问 fail() 成员函数.

    2.7K20

    CC++语言字符串操作总结大全(超详细)

    strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置 0 以根据特定格式判断所用进制,0x, 0X 前缀以解释十六进制格式整型...isspace() 检查是否空格类型字符 iscntrl() 检查是否控制字符 ispunct() 检查是否标点符号 isalnum() 检查是否字母和数字 isprint() 检查是否是可打印字符...C++概念字符串操作   一、char_traits 字符特征类 1)意义:包装特定串元素的通用行为界面,以便容器实现时依据特征信息执行特定行为 2)定义了通用类型名      [cpp]     ... 4)int_type 类型应是当前字符类型的整型编码   二、std::string 并不是序列容器,没有 front() 和 back() 界面用于取出前端和尾端的元素,使用 std::string...运算符,可以定义输入流在布尔表达式中的行为,使得当流读取失败的情况下,输入迭代器可以通过布尔表达式来确认,不是显式访问 fail() 成员函数.

    86220

    C++函数指针和std::function对象

    我们在博文《C++实现一个简单的String类》中的自定义的String类基础,再添加两个成员函数用于将字符串全部转为大写(toUpperCase)和全部转为小写(toLowerCase)。...这里我们的std::function对象类型的返回值和参数列表都是char。 (为什么不跟前面一样都用int呢?不感兴趣的可以忽略这一段。...locale头文件中的这两个函数的返回值和参数是char_type类型,编译不通过。...所以我将std::function对象类型的返回值和参数列表定义char,然后在String::toUpperCase和String::toLowerCase函数中使用匿名函数(Lambda)将cctype...int进行了强制转换,这样才可以跟定义的std::function类型的函数签名相符。

    2.6K30

    C++PrimerPlus学习之输入,输出和文件

    wcin对象与此类似,但处理的是wchar_t类型。cout对象与标准输出流对应。在默认情况下,这个流被关联到标准输出设备(通常显示器)。wcout对象与此类似。...在默认情况下,这个流被关联到标准输出设备(通常显示器)。这个流没有被缓冲,这意味着信息将被直接发送到屏幕,不会等到缓冲区填满或新的换行符。wcerr对象与此类似。clog对象也对应着标准错误流。...使用cout进行输出   write()    模板原型basic_ostream& wirte(const char_type *s,streamsize n);  write...使用cout调用write()时,将调用char具体化,因此返回类型ostream &一个例子#include using namespace std; int main...返回值是类型fmtflags的数字,指出所有标记以前的设置。如果打算以后恢复原始设置,则可以保存这个值。

    62700

    谢宝友:深入理解 RCU 之概念

    在这种情况下,可以使用一个全局指针,即gptr,通常NULL,表示要使用默认值。偶尔也可以将gptr指向假设命名为a、b和c的变量,以反映气压的变化。...这种简单的方法有一个最大的问题:它会使软件效率下降数个数量级(注意,不是下降数倍而是下降数个数量级)。...Seqlock可以保护一组相关联的数据,RCU只能保护指针这样的unsigned long类型的数据。...Linux的其他链表、哈希表都是线性链表,这意味着它的头结点只需要一个指针,不是象循环链表那样需要两个。因此哈希表的使用可以减少哈希表的hash bucket数组一半的内存消耗。...第3行将q->b的值更新2,第4行将q->c的值更新3。 现在,第5行开始替换,这样新元素终于对读者可见了,因此颜色也变成了红色。此时,链表就有两个版本了。

    5.6K10

    Linux-基础IO

    但是为什么 显示器文件、键盘文件 这些文件我们并不需要直接打开就可以直接使用呢? 文件在打开的前提一定是基于进程的,进程在运行的过程中会打开默认的三个流,即标准输入流,标准输出流、标准错误流。...并且为什么它们是连续的??   其实0、1、2文件描述符已经被使用了!其分别是:标准输入、标准输出、标准错误!它们是连续的,其实也就是 数组下标!   ...在上文我们说stdin、stdout、stderr这三个流的类型皆是 FILE* 类型每个文件都有自己的FILE结构体,所以 每个文件都有自己的缓冲区!   ...write为什么只打印一次?这是因为write函数是系统调用,并 不参与 语言层的缓冲区,所以只打印一次。   ...文件=内容+属性;一个文件是否空都会存在属性,操作系统为了维护文件的属性,先描述再组织,将文件的属性组织一个结构体file, 每个file以双链表的形式相连。

    10010

    完成端口与线程池的关系_端口触发

    2.在GetQueuedCompletionStatus中,没有错误,但总是返回读取的字数0。I/O重叠结构中也收不到任何字符。...肯定不是!如果那样还用扩展的I/O结果何用。一定是哪里指定了接收的数目,自己不小心指定为0了,所以没有接收数据。找了半天果然如此。...为什么要用AcceptEx?...对于第4步,为什么要获取AcceptEx的指针,不是直接就调用AcceptEx这个函数呢?网上找到的资料是这么说的: Winsock2的其他供应商不一定会实现AcceptEx函数。...而是,主线程直接创建2000个线程,在每个线程中去连接服务器(觉得这样更能体现并发连接),多开几个客户端,每个客户端的连接数最大线程数,服务端同时处理的连接数12562(开更多的线程连接数更多,有兴趣的可以试一下

    91130

    LIDC-IDRI肺结节公开数据集Dicom和XML标注详解数据来源解析结果数据分析

    eg: 对于病例LIDC-IDRI-0001,即为133512512的矩阵,一共133张切片,每张大小512*512,依次按顺序存入二进制文件,每个像素大小2字节(对应C中short类型)。...切片个数; rows : 矩阵行数,默认512; cols : 矩阵列数,默认512; data_type : 数据类型标签。...以下枚举类型中的一种(默认SHORT_TYPE,4):enum DATA_TYPE { CHAR_TYPE, UCHAR_TYPE, INT_TYPE, UINT_TYPE, SHORT_TYPE...的倍数); Xi, Yi, Zi:该肺结节第i个点的空间坐标,Zi切片序号; 数据位置: @news-ai:/baina/sda1/data/lidc_matrix/ (DAT矩阵,TXT标注)...于是追根溯源,看一下到底是怎么回事,自己写脚本遍历LIDC-IDRI-0017中所有dcm切片,打印出所有切片sop_uid,作对比,然后发现在所有的结果中,根本没有找到医师2,医师4标记的那个sop_uid,医师

    5.4K80
    领券