怎样在 C++里用 C-style 按行读取文件并不分配 heap 内存?

2022-09-14 13:09:01 +08:00
 dangyuluo

同事的破要求,按行读取一个文件,不让用 ifstream ,仅仅是因为“We don't have a precise understanding of how much memory the program will allocate”。想用getline但是getline也会分配内存。请问有没有什么现成的轮子?谢谢。

2467 次点击
所在节点    C++
25 条回复
saberlong
2022-09-15 07:59:19 +08:00
你同事的意思是不是读一行处理一行?
forcecharlie
2022-09-15 10:03:35 +08:00
用栈变量就可以按行读取了,如果是 Windows 用 ReadFile 如果是其他系统用 read ,换行的话用 memchr 快速查找 '\n',不用 fstream 就可以实现。当然这里为了支持任意长度的一行,你需要引入状态。
hu8245
2022-09-15 10:53:22 +08:00
把此需求转给架构师
FrankHB
2022-09-15 23:17:14 +08:00
连 ifstream 都写不出来的好意思纠结怎么 allocate memory ? review 直接穿小鞋。
(就是自己实现,不止是分析;重点是 basic_filebuf ;别说找不到抄哪。)

清楚栈可能实际会造成问题是入门,但拿对实现细节和运行时假设的依赖当做拒绝的理由说服力是不大够的。

言简意赅、强而有力:就你也配挑三拣四?
就是甲方爸爸都特么不大可能配关心这种问题,还特么是这种方法论上就没靠谱结果的问题。
合格的 C 和 C++用户:知道 ISO C 和 ISO C++都根本就不管什么栈,哪怕拒绝分配栈给你自动对象于是 int main(){volatile char x = 0;}都炸栈 UB 也照样 conforming——原则上,自动对象根本不需要被 allocate 。
所以谁倒是给我发明个光扯什么 C++和 C style 就能怎么敲捣出 precise understanding 的方案出来?

会纠结 allocate memory 的,最起码也得了解一种 allocator model 并且会自己正确实现有实用意义的实例,写出用例说明相对默认策略有效改进在哪。
如果想装自认为有能力指定全局默认策略的专家,我会把门槛设置到用 C++11 正确实现 std::make_obj_using_allocator ,而不只是稀里糊涂分析具体实现。
分析不清楚 ISO C 和 POSIX 等相关 C API 设计缺陷甚至只会无脑 malloc 连 realloc 哪里弱鸡都没个谱的,禁止覆盖选型决策。
毕竟,这里有人也提到了,正常人是“通常应该清楚自己在做什么”,而不是“清楚系统和程序在做什么”。事实上,正常语言实现的设计从一开始压根就不会照顾任意允许 yy“清楚”细节的伪需求。

@Jirajine “栈上”和“静态”,你是想说哪个?(虽然看上去哪个都说得通。)

@GeruzoniAnsasu 想多了。就这观念,能 precisely alloc heap 就有鬼了,占位的 header 多大怕都搞不清楚。

@iyeatse 就这症状,想 precise 是不是还要教清楚怎么算 I/O buffer ?
典型 C 实现中有些 buffer 配置可是找不到符号的呢……有的折腾了。

@cntatch 就算埋坑,有关 bug 也可能从来不被发现,直到你替他擦屁股的时候。

@chenzhongxiang 太放水了。
glibc 质量还是挺菜的,虽然主要是设计而不是实现问题。

@zengmingyang96 指定个 2^4096B 试试?还有指定了就一定能留得出来?

@dangyuluo 不管你拿多少,当务之急不是先考虑怎么把菜鸡撵走吗?
如果这同事就是给你发钱的老板,当我没说。……就指使别人撵(

@saberlong 显然不是。都说拒绝 getline 了。

@forcecharlie 这不就是自己造_IOLBF 特供的丐版 ifstream 么。

@hu8245 正解,不过最好还是有代码风格合规负责人教育什么清楚事情应该什么人管。
dangyuluo
2022-09-16 01:38:29 +08:00
@FrankHB 大佬息怒。最后我用 fgets 配合自己的 stack buffer 写好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/879945

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX