[C++][文本操作]逐行读取文本并倒序输出

Cplusplus
头像
vicyang
版主
版主
帖子: 56
注册时间: 2016年07月21日 20:35
拥有现金: 锁定
储蓄: 锁定
Has thanked: 7 times
Been thanked: 5 times
联系:

[C++][文本操作]逐行读取文本并倒序输出

帖子 #1 vicyang » 2019年01月15日 09:38

Code: [全选] [展开/折叠] [Download] (read_line.cpp)
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <vector>
  5.  
  6. using namespace std;
  7. int main(int argc, char *argv[] )
  8. {
  9.     string fname="read_line.cpp";
  10.     vector<string> lines;
  11.     string a;
  12.     ifstream fh( fname.c_str() );
  13.     if (!fh) cerr<<"can't open input file"<<endl;
  14.  
  15.     while ( getline(fh, a) )
  16.         lines.push_back(a);
  17.  
  18.     for (int i=lines.size()-1; i>=0; i--)
  19.         cout << lines[i] << endl;
  20.  
  21.     fh.close();
  22.     return 0;
  23. }

正在学 ;)

输出结果:
}
return 0;
fh.close();

cout << lines[i] << endl;
for (int i=lines.size()-1; i>=0; i--)

lines.push_back(a);
while ( getline(fh, a) )
if (!fh) cerr<<"can't open input file"<<endl;
ifstream fh( fname.c_str() );
string a;
vector<string> lines;
string fname="read_line.cpp";
{
int main(int argc, char *argv[] )
using namespace std;

#include <vector>
#include <fstream>
#include <string>
#include <iostream>
(这里会多一个换行)


发现:getline会吃掉换行符,需要自己添加"\n"(可能导致结果不是原汁原味的),然后在倒序输出时,原本的“第一行”就多了个换行。
考虑:如果文件不大,可以尝试全部读进buffer,按 "\r\n"或者 "\n" 切割,然后反向获取并输出。

问题延伸:
如果文件达到10G,如何在控制在低内存占用的情况下逆序输出?

暂时考虑用 seek 操作,未完待续

头像
vicyang
版主
版主
帖子: 56
注册时间: 2016年07月21日 20:35
拥有现金: 锁定
储蓄: 锁定
Has thanked: 7 times
Been thanked: 5 times
联系:

Re: [C++][文本操作]逐行读取文本并倒序输出

帖子 #2 vicyang » 2019年01月15日 12:32

以前怕不是对C++有什么误解,以为特别难用。发现迭代器用起来也很爽:
Code: [全选] [展开/折叠] [Download] (Untitled.cpp)
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. void print(int n) { cout << n << endl; }
  6.  
  7. int main(int argc, char *argv[] )
  8. {
  9.     vector<int> arr(5,1);
  10.     for_each( arr.begin(), arr.end(), print );
  11.     return 0;
  12. }


又学了一下,可以用匿名函数了,逆序输出
Code: [全选] [展开/折叠] [Download] (Untitled.cpp)
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. int main(int argc, char *argv[] )
  7. {
  8.     vector<int> arr({1,2,3,4,5});
  9.     for_each( arr.rbegin(), arr.rend(), [](int n) { cout<<n<<endl; } );
  10.     return 0;
  11. }


回到 “C/C++”

在线用户

用户浏览此论坛: 没有注册用户 和 0 访客