C_and_CPP 板


LINE

※ 引述《forthcoming5 (XDDD)》之铭言: : 最近自学到ifstream等写法 : 其中有个题目是将ifstream读出来的档案 : 做分类+统整,档案是.txt : txt的内容例如: : &@$@&&@@:((;(& : sh tree f m hi tm it e iuytre : Rule fixed : 100 21 : 200 38 : 300 37 : 400 35 : 500 11 : 如果在rule跟fixed前面的文字、资料不想要 : 直接取下面的Rule跟fixed及後面的数值做处理 : 应该要怎麽做呢? : 老师是有提示用vector搭配parser等作法 : 但想很久一直没办法 : 跪求解答,将送上300p币,感恩 你可以想像 i(f)stream 是由一连串的字元所组成, 要在里面找寻特定字串可 以用 <algorithm> 里的 std::search() 来完成, 只是它要求参数必须满足 ForwardIteartor 概念 (concept), 亦即它预期迭代器 (iterator) 在没有做 累加时, 多次读出来的字元必须相同; 但 istream 物件的特性却是: 没有做快 取的情况下, 每个字元只能读一次, 是 InputRange 的概念. 当我们配对到字 串的同时, 我们也丢掉它了. 即使如此, 我们还是可以仿照 std::search() 的 逻辑顺势实作接受 InputIterator 的函式 drop_until(). drop_until() 的架构是这样的: 本体里包含一个回圈, 每次迭代都只对参数做 一次累加还有读值, 并且复制读出来的物件往後做参考: template <typename InputIterator, typename InputSentinel> void drop_until(InputIterator first, InputSentinel last) { while (first != last) { auto element = *first++; // do things here } } 接着我们再加入额外的参数 pattern 作为要查找的对象, 它是一种 ForwardR- ange, 到这里和 std::search() 还蛮像的 (为了能在配对失败时重来, 我们再 新增一个迭代器物件): template < typename InputIterator, typename InputSentinel, typename ForwardRange > void drop_until(InputIterator first, InputSentinel last, const ForwardRange& pattern) { // match from beginning auto next_to_match = pattern.begin(); while (first != last && next_to_match != pattern.end()) { auto element = *first++; // match succeeding element in next iteration if (element == *next_to_match) { ++next_to_match; // fail to match, start over from second element } else if (element == *pattern.begin()) { next_to_match = std::next(pattern.begin()); // fail to match, start over from first element } else { next_to_match = pattern.begin(); } } } 以上还只是简单的实作, 虽然没办法处理复杂的字串, 但用来解原 po 的问题 已经足够. 有了 drop_until() 函式, 读档程式码就可以这样写: std::ifstream file("input.txt"); drop_until( std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), "Rule fixed\n"sv ); unsigned rule, fixed; while (file >> rule >> fixed) { // do things here } 完整范例: https://wandbox.org/permlink/gAssdOddYQtopotV 不过如果你有办法把整个档案都读进来变成一个大字串, 搭配 std::search() 的话会省下不少功夫 :) --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.216.75.43 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1602006183.A.438.html
1F:推 CoNsTaR: 说实话原 Po 没有把档案的语法讲清楚根本无法实作 10/07 03:06
2F:→ CoNsTaR: eg. Rule fixed 出现在上面的部分?多个 Rule fixed?上 10/07 03:06
3F:→ CoNsTaR: 面的部分可以为空?... 10/07 03:06
4F:→ CoNsTaR: 先把 syntax tree 定义好再来 parse 比较实在吧 10/07 03:06
5F:推 ddavid: 也没那麽无法实作吧,他也讲得很清楚上面的东西全舍弃,所 10/07 09:41
6F:→ ddavid: 以根本不用考虑上面有多少东西或可能没有东西,一行一行读 10/07 09:42
7F:→ ddavid: 到某行是Rule fixed即可 10/07 09:42
※ 编辑: loveme00835 (123.193.76.216 台湾), 10/07/2020 14:20:05
8F:推 CoNsTaR: 要是上面可以包含 Rule fixed 你要怎麽知道哪里属於“上 10/07 15:32
9F:→ CoNsTaR: 面”? 10/07 15:32
10F:推 ddavid: 对,你当然可以追究细节跟各种例外处理 10/08 12:48
11F:→ ddavid: 但是这跟「无法实作」完全是两回事 10/08 12:48
12F:→ ddavid: 业界多得是根本不知道上线才会发生什麽莫名其妙状况的实作 10/08 12:49
13F:→ ddavid: ,没有人会跟你说我得要把所有可能性毫无遗漏才能「实作」 10/08 12:50
14F:→ ddavid: 这题目的基础要求已经很明确了,当然可以实作 10/08 12:50
15F:→ ddavid: 只是你的实作可能会有缺陷,比如说我们都不知道原题目定义 10/08 12:51
16F:→ ddavid: 的完整文字,所以我们并不知道会不会有两行Rule fixed,会 10/08 12:51
17F:→ ddavid: 不会有大小写不同的rULE FIXED,会不会根本没有一行是 10/08 12:52
18F:→ ddavid: Rule fixed,会不会在Rule fixed的前中後有\r\n\t 10/08 12:52
19F:→ ddavid: 但你还是可以先写一个满足已知最单纯情况的实作 10/08 12:53
20F:→ ddavid: 然後如果你想到以上那些特殊情况,可是题目没讲会不会发生 10/08 12:55
21F:→ ddavid: 或该不该处理,那就表示我们可以无视让它发生错就错,或者 10/08 12:55
22F:→ ddavid: 用心点为每个情况写个处理,终究都还是可以实作一个版本啊 10/08 12:56
23F:→ ddavid: 这边的用词应该是「题意不够严谨」而不是「无法实作」, 10/08 12:57
24F:→ ddavid: 「无法实作」这词我会摆在根本没讲清楚基本要干嘛或真的做 10/08 12:57
25F:→ ddavid: 不到的情况XD 10/08 12:58
26F:推 lc85301: 传说中的客户进门点了一盘炒饭,酒吧陷入大火 10/08 20:35
27F:推 CoNsTaR: 你当然可以写一些自己都不知道在做什麽的程式去搪塞,但 10/08 22:46
28F:→ CoNsTaR: 对我来说那不叫实作 10/08 22:46







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP