C++ 新手 : template function problem--getting string and numerical data from text file, 将其放入 vector 中

标签 c++ templates stream

我是新手。我试图编写一个模板函数,从文本文件中获取字符串和数字数据(例如, double ),然后将其放入 vector 中。 vector 的每个元素都是不同的名称或编号。

上周我问过重载或模板是否最适合这个问题。我想使用模板方法,将结果 vector (我想要的)传递给函数以提供模板参数 T。但我遇到了问题。如果有人可以提供帮助,我将不胜感激!代码在下面,然后是我遇到的错误。

//我的代码:

template<typename T>
void readFile( const std::string& name, const std::string& find, std::vector<T>& results ){
    std::ifstream file( name.c_str( ) );
    std::string   line;

    while( std::getline( file, line ) )
    {
        if( line == find )
        {
            std::getline( file, line );
            line.erase(remove( line.begin(), line.end(), '\'' ), line.end() );
            std::istringstream streamLine( line );

            results = std::vector<T>( std::istream_iterator<T>(streamLine), std::istream_iterator<T>() );
        }
    }
}

在 main() 中调用:

readFile( name, "label", results );

我得到的错误如下。我不明白函数调用如何与定义不匹配。对于任何愚蠢的错误提前道歉!

error: no matching function for call to 
'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >
::resize(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'

奇怪的是,如果我让函数返回 vector “result”而不是 void,那么一切似乎都有效。这就是我的意思:

std::vector<T> readFile( const std::string& name, const std::string& find, std::vector<T>& results )

在函数定义中有一个return语句:

return std::vector<T>( std::istream_iterator<T>(streamLine), std::istream_iterator<T>() );

但这样做似乎笨拙/糟糕。我原以为使用引用会更好。即使它不是更好,我也很想知道为什么第一种方法(使用 void)不起作用。

如有任何提示,我们将不胜感激!

最佳答案

我必须做很多工作才能使它成为一个完全可编译的代码片段。这是我想出的:

#include <string>
#include <vector>
#include <istream>
#include <fstream>
#include <iterator>
#include <sstream>
#include <algorithm>

template<typename T>
void readFile(const std::string& name,
              const std::string& find,
              std::vector<T>& results )
{
   std::ifstream file( name.c_str( ) );
   std::string   line;

   while( std::getline( file, line ) )
   {
      if( line == find )
      {
         std::getline( file, line );
         line.erase(remove( line.begin(), line.end(), '\'' ), line.end() );
         std::istringstream streamLine( line );

         results = std::vector<T>( std::istream_iterator<T>(streamLine),
                                   std::istream_iterator<T>() );
      }
   }
}

void do_it_with_strings(std::vector<std::string> &results)
{
   readFile("fred", "barney", results);
}

此代码片段在 gcc 4.5.1 下编译得很好。 main 函数中 nameresults 的确切类型是什么?此外,问题似乎是调用 vector 的 resize 函数。您似乎没有直接在代码中执行此操作,尽管 vector 构造函数或赋值运算符可能在内部执行此操作。

但无论如何,我都不建议您以这种方式编写代码。我建议您改为这样做:

#include <string>
#include <vector>
#include <istream>
#include <fstream>
#include <iterator>
#include <sstream>
#include <algorithm>

template<typename T>
std::vector<T> readFile(const std::string& name, const std::string& find )
{
   std::ifstream file( name.c_str( ) );
   std::string   line;

   while( std::getline( file, line ) )
   {
      if( line == find )
      {
         std::getline( file, line );
         line.erase(remove( line.begin(), line.end(), '\'' ), line.end() );
         std::istringstream streamLine( line );

         return std::vector<T>( std::istream_iterator<T>(streamLine),
                                std::istream_iterator<T>() );
      }
   }
   return std::vector<T>();
}

void do_it_with_strings(std::vector<std::string> &results)
{
   results = readFile<std::string>("fred", "barney");
}

在这样的函数中,我认为最好在调用该函数时明确说明您希望读取的类型,而不是根据您的 vector 类型隐式确定它传入。

关于C++ 新手 : template function problem--getting string and numerical data from text file, 将其放入 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4922191/

相关文章:

c# - 从 StreamReader 流写入文件

c++ - 在 C++ 中重复跟踪计时器

c++ - 保证在处置类(class)时处置类(class)成员

c++ - C++中的try catch在未命中时会影响性能吗

c++ - 无法识别的模板声明/定义

javascript - 解析 JSON 流

c++ - WM_KEYDOWN - 捕获导致事件的按键

c++ - char* 具有内部链接,因此它不能不是非类型模板参数

c++ - 使 C++ 在模板函数的特定实例化时编译失败

c# - 有没有更好的方法将任意输入转换为 ASCII?