以相反顺序c ++从文本文件中读取行

时间:2015-01-03 07:21:00

标签: c++ io fstream

我需要找到一种从文件中读取最后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个数字,这是我需要的唯一信息。

此致

3 个答案:

答案 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的计数,以跟踪从末尾读取的行数。