我需要找到一种从文件中读取最后6行数据的方法。
例如,如果我有 1 2 3 4 五 6 7 8 9 10
我需要阅读才能得到 10,9,8,7,6,5,4。
然后将这些需要放入变量或字符串中以便稍后输出。目前我已经设法读取文件的最后一行,但我不知道如何读取其他5个数字。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
std::ifstream in("test.txt");
if (in.is_open())
{
std::vector<std::string> lines_in_reverse;
std::string line, line2;
while (std::getline(in, line))
{
// Store the lines in reverse order.
lines_in_reverse.insert(lines_in_reverse.begin(), line);
}
cout << line << endl;
while (std::getline(in, line2))
{
// Store the lines in reverse order.
lines_in_reverse.insert(lines_in_reverse.begin(), line2);
}
cout << line2 << endl;
}
cin.get();
return 0;
}
任何人都可以建议这样做吗?我不知道任何有用的功能或方法。
修改
此方法输出文件中的最后6个数字,但它们是向后的,我需要一种方法来反转它们并摆脱它打印出的空白。
我不确定如何使用反向以及需要哪些参数 - http://en.cppreference.com/w/cpp/algorithm/reverse
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
char x;
ifstream f("test.txt", ios::ate);
streampos size = f.tellg();
for (int var = 1; var <= size; var++){
f.seekg(-var, ios::end);
f.get(x);
reverse(x);
cout << x;
}
cin.get();
return 0;
}
很多回复告诉我如何使用向量反转文本文件,但不是最后6个数字,这是我需要的唯一信息。
此致
答案 0 :(得分:2)
存储您阅读的所有行并不是一个好主意,因为可能存在例如十亿行。
您只需存储最后的6个。
以下代码旨在以相反的顺序生成这些行,因为问题表明这是一个要求:
#include <iostream>
#include <string>
#include <deque>
using namespace std;
auto main() -> int
{
string line;
deque<string> last_lines;
while( getline( cin, line ) )
{
if( last_lines.size() == 6 )
{
last_lines.pop_back();
}
last_lines.push_front( line );
}
for( auto const& s : last_lines )
{
cout << s << endl;
}
}
这里的输出并不是问题的例子
“ 10,9,8,7,6,5,4
因为那7行,与第一句中所说的6行相矛盾。
答案 1 :(得分:2)
如何只用三个代码语句(不包括声明和其他样板)来读取文件并反向打印:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
void read_and_print_reverse_n(std::istream& is, const int n)
{
std::vector<std::string> v;
// This call reads all whitespace-delimited "words" from the input stream
// and appends them to the vector
std::copy(std::istream_iterator<std::string>(is),
std::istream_iterator<std::string>(),
std::back_inserter(v));
// Output the last `n` lines from the input
for (const auto i = v.rbegin();
i < v.rend() && i < v.rbegin() + n;
++i)
{
std::cout << *i << '\n';
}
}
int main()
{
read_and_print_reverse_n(std::cin, 6);
}
参考
答案 2 :(得分:1)
我认为答案here可以解决将行存储在向量中并从末尾迭代向量的目的。
当您正在寻找一些直接读取文件的方法时,您可以使用seekg和tellg从头开始逐个字符地读取文件。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
char x;
ifstream f("filename.txt",ios::ate);
streampos size = f.tellg();
for(int var=1;var<=size;var++){
f.seekg(-var,ios::end);
f.get(x);
printf("%c",x);
}
return 0;
}
您还可以保留\ n的计数,以跟踪从末尾读取的行数。