我试图通过在文件中的每一行的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);
}
}
}
答案 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));