问题标签 [filebuf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
702 浏览

c++ - 解释对 GNU C++ filebuf::underflow() 与 filebuf::seekoff() 交互的更改

我公司的产品在许多合格的 Linux 硬件/软件配置上运行。从历史上看,使用的编译器一直是 GNU C++。出于本文的目的,让我们将版本 3.2.3 视为基线,因为我们的软件在该版本中“按预期工作”。

随着更新的合格平台的引入,使用 GNU C++ 3.4.4 版,我们开始观察到一些我们以前没有见过的性能问题。经过一番挖掘,我们的一位工程师想出了这个测试程序:

我们针对大约 751KB 字符的日志文件运行它。在之前的配置中,我们得到了结果:

在较新的版本中,结果是:

注释掉pubseekoff(0, ios::cur)调用,过多的underflow()调用消失。很明显,在较新版本的 g++ 中,调用pubseekoff()会使缓冲区“无效”,从而强制调用underflow()

我已经阅读了标准文档,关于pubseekoff()的措辞肯定是模棱两可的。例如,底层文件指针位置与gptr()的位置有什么关系?在调用underflow()之前还是之后?不管怎样,可以这么说,我觉得 g++ '在中游换马' 很烦人。此外,即使一般的seekoff()需要使缓冲区指针无效,为什么要等效于ftell()

任何人都可以指出导致这种行为变化的实施者之间的讨论线程吗?你对所涉及的选择和权衡有一个简洁的描述吗?

额外学分

显然我真的不知道我在做什么。我正在尝试确定是否有一种方法(无论多么不可移植)在 offset 为 0 且 seekdir 为ios::cur的情况下绕过失效。我想出了以下 hack,直接访问filebuf数据成员_M_file(这只是想在我的机器上用 3.4.4 版本编译):

但是,每百次搜索尝试打印出位置的诊断每次都会产生 8192。嗯?由于这是filebuf本身的FILE *成员,我希望它的文件位置指针与filebuf进行的任何underflow()调用同步。为什么我错了?

更新

首先,让我强调一下,我理解我帖子的后面部分都是关于非便携式黑客的。尽管如此,还是不​​明白这里的细节。我试着打电话

相反,这会愉快地通过示例文件进行,而不是卡在 8192。

最终更新

在我的公司内部,我们已经制定了一些变通办法,可以将性能影响降低到我们可以忍受的程度。

在外部,David Krauss 提交了一个针对 GNU 的 libstdc++ 流的错误,最近,Paolo Carlini 签入了一个修复程序。共识是不受欢迎的行为在标准的范围内,但是对于我描述的边缘情况有一个合理的修复。

非常感谢 StackOverflow、David Krauss、Paolo Carlini 和所有 GNU 开发人员!

0 投票
1 回答
380 浏览

c++ - 尝试从 wfilebuf (filebuf) 派生以进行日志记录

我基本上是在尝试从 wfilebuf 派生,因此我可以输出到文件并截取输出以将其打印到控制台/调试窗口,如下所示:http: //savingyoutime.wordpress.com/2009/04/ 21/和/或这里:http ://savingyoutime.wordpress.com/2009/04/22/40/

(古老的支持思想在这里: http: //www.horstmann.com/cpp/streams.txt

我几乎明白了,但我似乎无法同时写入基础文件并查看输入。

我覆盖了类似于第二个示例的 sync() 函数,但似乎 pbase() 和 pptr() 始终为 NULL,除非我使用 setp(...) 设置缓冲区,但这似乎破坏了文件输出。文件总是空的!

我对此的粗略尝试如下:

完全披露:我之前问过一个类似的问题:Simple wostream logging class (with custom stream manipulators)

我想我已经解决了这个问题。

任何帮助是极大的赞赏!谢谢!

0 投票
3 回答
1301 浏览

c++ - 具有多个缓冲区的 std::fstream?

您可以像这样为文件流指定一个缓冲区:

我现在想做的,是使用不止一个缓冲区:

是否可以不创建 std::streambuf 的自定义派生?

编辑: 我想我需要更详细地解释我想要做什么。请考虑以下情况: - 我要读取的文件不适合内存 - 通过某种二进制跳转搜索访问的文件

因此,如果您将文件拆分为特定大小的逻辑页面,那么我想提供多个表示特定页面的缓冲区。当读取文件位置并且相关页面已经在缓冲区中时,这将提高性能。

0 投票
1 回答
601 浏览

c++ - 对于文件读取,何时使用 filebuf

我将从只读二进制文件中进行随机访问读取。ifstream 的接口似乎比 filebuf 简单;但是有没有什么用例可以让 filebuf 提供更好的性能?

更多详细信息:我有一个固定长度(48 字节)记录的文件,并将按顺序进行随机访问读取——读取 1 条记录,处理,读取 1 条记录(从其他地方),处理,...。 (遍历一棵树。)文件永远不会改变。由于记录是固定长度的,我以后可能会使用 48 字节记录的“字符类型”,但我认为这不会对性能产生任何影响。

0 投票
1 回答
1043 浏览

c++ - 定制的“ofstream”输出

我必须扩展 ofstream 类来编写日志流服务。

目标是截取每一行,在每一行的开头添加自定义文本(日期/时间、严重性等)。

现在,很明显我不是 C++ 大师,所以我阅读了很多关于这个任务的文档,例如

http://www.angelikalanger.com/Articles/Topics.html#CPP http://asmodehn.wordpress.com/2010/06/20/busy-c-coding-and-testing
http://gabisoft.free。 fr/articles-en.html

上面的文章建议编写一个自定义流缓冲区,但是在将这个概念移植到文件流上时,我遇到了很多困难。

有没有更简单的方法来实现这个目标?

0 投票
1 回答
98 浏览

c++ - 缓冲区如何知道在刷新操作期间要从外部文件传输多少字符?

假设我有一个输入操作:

如果 的内部缓冲区file为空underflow(),将调用将字符从外部设备导入 的内部缓冲区file。如果在此刷新操作之后缓冲区将被部分或完全填充,则由实现定义。考虑到这一点,是否有可能如果x是一个字符串并且我期望一个特定长度的输入值,那么缓冲区是否有权传输比这更少的字符?这会发生吗?

0 投票
1 回答
1848 浏览

c++ - 无法使用 __gnu_cxx::stdio_filebuf 进行流式传输

这会创建文件,但不会写入任何内容。

我知道还有其他简单的解决方案可以实现输出,但是我需要使用这个非标准的 filebuf 在编辑时锁定文件,以便其他进程无法打开文件。我不知道为什么这不起作用。

0 投票
0 回答
115 浏览

c++ - 如何在使用 std::fstream 和 std::filebuf 时正确检查复制文件的结果

我想使用广为人知的代码片段来复制文件:

问题是:如何正确检查复制是否成功?

我认为检查 (src && dest) 的值是可以的,但是在源文件为空的情况下它会失败。

0 投票
1 回答
670 浏览

c++ - 使用 iostream 从 filebuf 读取和写入

iostream从 a分配astringbuf时,一切正常

17 42

但是,如果我尝试更改我stringbuf的使用 afilebuf它不再起作用

0 0

ghex 告诉我"/tmp/buffer.dat"包含它的假设。

  • filebuf是否可以在不关闭和重新打开文件的情况下从 a 读取和写入?
0 投票
4 回答
56 浏览

c++ - 标准函数和操作在类构造函数中不起作用

我正在尝试使用构造函数制作我的第一堂课,但它似乎表现得很奇怪。我的类派生自filebuf并且由于某种原因,我无法在构造函数中打开它。我尝试添加一条cout调试语句,但<<无法识别操作符。

二进制文件