Re: [问题] 如何将文件内容顺序天地颠倒

楼主: poyenc (发箍)   2019-09-29 12:55:58
※ 引述《InvincibleK (我是无敌的K)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: Linux
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: GCC
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: no
: 问题(Question):
: 如何将文件内容顺序天地颠倒
: 喂入的资料(Input):
: a1xxx
: b2xxxxxx
: a77oooooo
: c3xxx
: d4xxxx
: e5xxxxxx
: ...
: z998ooooo
: z999xxxx
: 行数不定.
: 预期的正确结果(Expected Output):
: 请问要怎么作到文件内容顺序天地颠倒,变成:
: z999xxxx
: z998ooooo
: ...
: e5xxxxxx
: d4xxxx
: c3xxx
: a77oooooo
: b2xxxxxx
: a1xxx
: 然后存新档?
: 错误结果(Wrong Output):
: 文件没有天地颠倒
: 程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
: 未进行程式撰写
: 补充说明(Supplement):
: 本来单纯只想用指令完成,没有成功.
看标题以为是很复杂的处理; 不过这个题目虽然简单却是个练习写
C++ 的好材料. 不知道原po 有否想过如果题目条件改一下, 程式码
需要变动多少行才能达成需求呢?
1. 行输出顺序和原档案相反, 且每行的内容反过来
2. 行输出顺序和原档案相同, 每行的内容不变
3. 行输出顺序和原档案相同, 但每行的内容反过来
最理想的答案是: 一行. 顺便也推广 C++ 其中一个核心精神:
只需要写一份程式码即可满足不同需求
为了达成这个目标需要稍微做一点努力, 把原始码整理成分工非常
明确的 3 个部分:
1. 处理输入
2. 内部储存
3. 处理输出
行的顺序我们可以透过抽换 2 的资料结构来完成, 这个很简单,
就是使用 std::queue 和 std::stack 的分别. 为了节省空间只储
存成对的迭代器 (iterator) 来标示行的开始和结束, 以下是简单
的范例:
https://bit.ly/2obN2oA
不过处理这种配接器 (adaptor) 最麻烦的是接口不一致:
for (; !lines.empty(); lines.pop()) {
const auto line = lines.top(); // will be front() if
// we use std::queue
}
这个时候就需要提供一组多载函式统一呼叫语法, 这样就可以顺利
将资料结构换成 std::queue:
https://bit.ly/2nEPqDZ
像这个案例提供多载函式甚至是函式模版在 C++ 里是再平常不过的
事情, 注意型别别名 (type alias) 的定义位置有些改动, 主要是
为了提供抽象化以及消除重复的程式码. 至此抽换资料结构只需要
改一行.
另外要处理的是将字串内容反向印出, 也是对资料结构下手就好.
这时可以使用类别模版 std::reverse_iterator<Iter> 达成统一语
法的效果, 我们需要做的只是修改配接器的型别以及使用配接器的
地方:
https://bit.ly/2m3GV5a
新增 create() 函式回传成对的迭代器, 且在需要将字串反转的情
况下回传型别经包装过的迭代器物件, 至此只需要改一行就能决定
印出的字串内容.
以上讲的都是个别处理字串顺序/内容的手法, 若要组合两者可以用
policy-based design 来进一步改写, 依功能面可分为:
1. line order policy
2. line content policy
各自定义需要的型别以及函式, 最后再用继承将它们组装起来, 变
成下面的程式码:
https://bit.ly/2ohwsDX
以上就是这个题目的一些变种提供给原po做练习, 其实还可以试试
其他更进阶的版本:
1. 将字串依照长到短的顺序印出
2. 将字串的大小写反转
...
作者: plumefly (琰)   2019-09-29 14:28:00
大推!
作者: DLHZ ( )   2019-09-29 20:38:00
作者: Philethan (PE)   2019-09-29 21:59:00
WOW
作者: heardringo (love ringo)   2019-09-30 09:50:00
作者: ilikekotomi (Young)   2019-10-01 00:35:00
作者: F04E (Fujitsu)   2019-10-03 16:40:00
push
作者: nullptr (SIGSEGV)   2019-10-21 02:04:00
好文!

Links booklink

Contact Us: admin [ a t ] ucptt.com