文件i/o-c++ peek()和tellg()一起使用的bug

问题描述

c++ peek()和tellg()一起使用的bug

cout<<"1-"<<Receive.tellg()<<endl;

cout<<"2-"<<char(Receive.peek())<<endl;

cout<<"3-"<<Receive.tellg()<<endl;

cout<<"4-"<<char(Receive.peek())<<endl;

cout<<"5-"<<Receive.tellg()<<endl;

cout<<"6-"<<char(Receive.peek())<<endl;

cout<<"7-"<<Receive.tellg()<<endl<<endl;

程序的其他部分与问题无关,大概是从尾到头读一个txt文件里的所有字符,我在debug的时候发现了这个现象:
1. 第一个tellg返回的指针位置是正确的,但是如果后面跟着一个peek,再用tellg返回指针位置就会+1了。peek按理来说不会移动文件指针,但后面再重复几次又不会每次都+1。
2. 貌似是跟windows系统换行符有关,如果txt文件里没有换行符的话就没有这个问题。

我google了一下,发现国外很多论坛有人提相同的问题,有人解答说peek+tellg是c++的一个经典bug,不过也没有找到清楚的解答,求大神指点!

解决方案

std::istream::peek
int peek();
Peek next character
Returns the next character in the input sequence, without extracting it: The character is left as the next character to be extracted from the stream.

返回下一个,但是不提取,所以还是保留在原来的位置。

解决方案二:

"http://compgroups.net/comp.lang.c++.moderated/peek-and-tellg/39837"也许可以帮助到你。
"it mixes two different ways of accessing a stream:
-- as a one-pass input stream with limited pushback
-- as a random-access sequence with bookmarks
It has been known for decades that trying to access the same stream both ways is fraught with peril. Whether you call the resulting surprising behavior buggy or regrettable is a matter of taste.
If you want robust code, don't mix peek and seek/tell."
没看太懂啥意思,只知道peek和seek/tell混用会有问题。

std::istream::peek
Internally, the function accesses the input sequence by first constructing a sentry object (with noskipws set to true). Then (if good), it reads one character from its associated stream buffer object by calling its member function sgetc, and finally destroys the sentry object before returning.

std::istream::tellg
Internally, the function accesses the input sequence by first constructing a sentry object (with noskipws set to true) without evaluating it. Then, if member fail returns true, the function returns -1.
Otherwise, returns rdbuf()->pubseekoff(0,cur,in). Finally, it destroys the sentry object before returning.

时间: 2024-11-02 03:15:46

文件i/o-c++ peek()和tellg()一起使用的bug的相关文章

如何知道c++的文件读取流ifstream当前读取的位置?

问题描述 如何知道c++的文件读取流ifstream当前读取的位置? 我知道如果要定位ifstream的位置可以用诸如ifstream.seekg(offset, ios::cur)这样的方法,但是我想知道ifstream当前读取的位置怎么写呢?这是个现实的需求,我必须先得到这个位置,然后读取线程退出,再启动读取线程时用上面的seekg方法定位到之前的位置继续读取下去,我觉得这是一个挺普通的功能需求,ifstream类应该已经提供了现成方法的吧??怎么写呢?望高手指教! 解决方案 tellg()

C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名

原文:C# 文件操作(全部) 追加.拷贝.删除.移动文件.创建目录 修改文件名.文件夹名 本文也收集了目前最为常用的C#经典操作文件的方法,具体内容如下:C#追加.拷贝.删除.移动文件.创建目录.递归删除文件夹及文件.指定文件夹下面的所有内容copy到目标文件夹下面.指定文件夹下面的所有内容Detele.读取文本文件.获取文件列表.读取日志文件.写入日志文件.创建HTML 文件.CreateDirectory方法的使用.修改文件或文件夹名称等方法使用..... C#追加文件 StreamWrit

c++ fstream 文件读写-C++ fstream读写文件 文件指针

问题描述 C++ fstream读写文件 文件指针 ifstream file; ....... //中间有读写文件操作 int i; i = file.tellg(); file >> str1; file.seekg(i); file >> str2; 请问 这两个 str为什么不一样 我确认 在file>>str1和file>>str2这两个语句之前 seekg() 返回的值是一样的 解决方案 读写文件(fstream)用fstream对二进制文件的读

简单解决新浪SAE无法上传文件的问题

  这篇文章主要介绍了简单解决新浪SAE无法上传文件的问题,不知道到底是新浪的BUG还是我个人的问题,分享给大家吧. 今天给网站后台增加一个上传文件的功能,结果出现BUG,提示未选择上传文件. 以下是代码部分. ? 1 2 3 4 5 6 7 8 9 10 <form method="post" action="attached.php?action=upload_post" enctype="multipart/form-data">

动态载入/删除/更新外部 JavaScript/Css 文件的代码_javascript技巧

动态载入 JavaScript/Csss 文件 传统加载外部JavaScript(*.js) 或者 Css(*.css)文件的方法是直接在<head>标签里面进行添加: 复制代码 代码如下: <head> <script type="text/javascript" src="myscript.js"></script> <link rel="stylesheet" type="te

ftp软件的bug: 上传和下载的php文件换行丢失

在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了,导致php文件无法正常运行. 这个时候,再次通过ftp软件把刚才上传的php文件下载到本地windows,用notepad++编辑器打开后,发现php源代码变成了一行,换行丢失. 发生这种情况的原因是什么呢?飘易就以一句话概括下: 由于linux下换行是n,而windows下换行是rn,当ftp软件在上传时,默认

使用ftp软件上传下载php文件时php文件中换行丢失

   在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了,导致php文件无法正常运行.     这个时候,再次通过ftp软件把刚才上传的php文件下载到本地windows,用notepad++编辑器打开后,发现php源代码变成了一行,换行丢失.     发生这种情况的原因是什么呢?飘易就以一句话概括下:     由于linux下换行是n,而windows下换行是r

IE6 PNG透明DD

当前最流行最实用的IE6支持PNG图片的方案,以供大家学习参考! 我们都知道在目前所用的png图片透明解决方案基本都是使用滤镜.xpression解决的.透明gif替代.但是这些方法都有一个缺点,就是不支持CSS中backgrond-position与background-repeat.而这次的js插件使用了微软的VML语言进行绘制且不需要引入其他文件,一个小小的js就可以完美解决png图片bug就连img标签和hover伪类也可以很好的解决.   思路:    1.首先下载此方案所用到的文件,

Linux下Oracle8i的安装(转)

oracle oracle 8.05 的简明安装和操作说明oralce 支持Linux 给了我们一个免费解除她的好机会,但有好多网友并非此中专业人士(就象我一样),我就把我的一些操作程序写出来,希望对大家会有所帮助.一.安装前的准备工作   1 ,建立一个oracle 的安装用户,因为oracle 不能用root来安装,若强行用root她会报错,然后罢工.       #useradd oracle(当然可以是任何名字,但推荐用oracle 做用户名)       #passwd oracle