如何将文本文件读入deque

时间:2011-07-08 21:24:09

标签: c++

我试图通过在文件中的每一行的deque中添加一个新条目,从txt文件构造字符串的deque(在C ++中)。下面是我对该函数的尝试 - 我知道while循环正在执行正确的次数,但是在调用此函数后,队列始终为空。我确定我错过了一些小的东西(C ++语法和工作方式很新......),非常感谢任何帮助。

void read_file(string file_name, deque<string> str_queue) {
    ifstream filestr;
    filestr.open(file_name);
    if (!filestr.is_open()){
        perror ("Error opening file.");
    }
    else {
        while (filestr) {
            string s;
            getline(filestr,s);
            str_queue.push_back(s);
        }
    }
}        

4 个答案:

答案 0 :(得分:9)

您正在通过传递队列,而不是通过引用传递队列。试试这个:

void read_file(const string &file_name, deque<string> &str_queue) {

答案 1 :(得分:3)

通过deque<string>reference传递pointer。您正在创建一个本地deque,它在通话结束时超出范围。

答案 2 :(得分:1)

我建议使用STL为您工作(参见 working demo on codepad [1]);这个程序将在stdout上复制自己:

#include <iostream>
#include <fstream>
#include <iterator>
#include <deque>
#include <vector>

using namespace std;

struct newlinesep: ctype<char>
{
    newlinesep(): ctype<char>(get_table()) {}

    static ctype_base::mask const* get_table()
    {
        static vector<ctype_base::mask> rc(ctype<char>::table_size,ctype_base::mask());
        rc['\r'] = rc['\n'] = ctype_base::space;
        return &rc[0];
    }
};

int main()
{
    deque<string> str_queue;

    ifstream ifs("t.cpp");
    ifs.imbue(locale(locale(), new newlinesep));
    copy(istream_iterator<string>(ifs), istream_iterator<string>(), back_inserter(str_queue));
    copy(str_queue.begin(), str_queue.end(), ostream_iterator<string>(cout, "\n"));
    return 0;
}

从这个答案中借用了自定义区域设置(使用newlinesep)的想法:Reading formatted data with C++'s stream operator >> when data has spaces


[1]有趣的是,这告诉我们很多关于codepad.org的实现细节;我不仅猜测使用了源文件名(t.cpp),而且还可以看到源代码被略微修改( prelude.h? - 也许它是一个巨大的预先编译头以减少服务器负载)

答案 3 :(得分:1)

我将从previous question的一个答案开始。在我的回答中,我使用std::set给出了一个示例,使用std::vector给出了一个示例,但如果您使用std::deque代码,代码应继续正常工作:

std::deque<std::string> lines;

std::copy(std::istream_iterator<line>(std::cin), 
          std::istream_iterator<line>(),
          std::back_inserter(lines));