首页 文章

C rookie(streams)...如何从字符串中有空格的文件中读取字符串(例如Tom Smith)?麻烦使用getline代替>>

提问于
浏览
4

我写了一个模板函数,用于从文件中读取字符串或数字数据,并将数据保存在字符串或整数/双精度的向量中 . 然后我使用数据用我写的另一个代码执行计算 .

提前道歉,因为我认为这是一个简单的问题...我无法读取有空格的字符串数据...例如,名字和姓氏 . 当我想要“汤姆史密斯”时,我只能得到“汤姆” . 从谷歌搜索,似乎问题是>>,我应该使用getline . 我已经尝试用getline替换>>(test,100),但是我得到了一个“没有匹配函数来调用std :: basic_istringstream ...”类型错误(错误:没有匹配函数来调用'std :: basic_ifstream> :: getline(double&)')

如果有人能说得对我,我将非常感激!我似乎无法绕过溪流!

这是一些示例数据和我的代码 . 我在这里为它配置了字符串 .

labelInFile //一个向量的数据子集的标识符

'汤姆史密斯''杰基布朗''约翰多伊'//这些名字应该最终成为矢量中的元素

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

using namespace std; 

template<typename T>  
void fileRead( std::vector<T>& results, const std::string& theFile, const std::string& findMe, T& test )  
{   
    std::ifstream file( theFile.c_str() ); 
    std::string   line;

    while( std::getline( file, line ) )
    {
        if( line == findMe )
        {
            do{
                std::getline( file, line, '\'' );  
                std::getline( file, line, '\'');

                std::istringstream myStream( line );

                myStream >> test;
                results.push_back( test );
            } 
            while ( file.get() != '\n' );
        }
    }
}


int main () 
{
    const std::string theFile               = "test.txt";  // Path to file
    const std::string findMe                = "labelInFile"; 
    std::string test;

    std::vector<string> results;

    fileRead<std::string>( results, theFile, findMe, test );

    cout << "Result: \n";
    std::copy(results.begin(), results.end(), std::ostream_iterator<string>(std::cout, "\n")); 

    return 0;
}

2 回答

  • 1

    我编写了一些代码来解决你的部分问题:解析名称 . 您可以根据自己的需求进行调整 . 注意:这不是解决此问题的最快方法,但这是一种希望易于理解的简单方法 .

    Test.cpp

    #include <iostream>
    #include <iomanip>
    #include <fstream>
    #include <string>
    #include <vector>
    
    int main()
    {
        const char szFname[] = "Test.dat";
        std::vector<std::string> vData;
    
        std::ifstream ifstr(szFname);
    
        while (ifstr.good())
        {
            // find first quote
            ifstr.ignore(0xffff, '\'');
            std::string sData;
            char ch;
            while (ifstr.good() && ('\'' != (ch=ifstr.get())))
                sData += ch;
            if (!sData.empty())
                vData.push_back(sData);
        }
        for (size_t i=0; i<vData.size(); ++i)
            std::cout << vData[i] << std::endl;
    
        return 0;
    }
    

    Test.dat

    'Tom Smith' 'Jackie Brown' 'John Doe' 
    'Robert Burns'   'James Joyce''Joseph Conrad' 'Dylan Thomas'
    'Edgar Allan Poe' 'V.S. Naipaul' 'Vladimir Nabokov'
    'William Shakespeare'  'William Langland' 'Robert Greene'
    

    Results

    Tom Smith
    Jackie Brown
    John Doe
    Robert Burns
    James Joyce
    Joseph Conrad
    Dylan Thomas
    Edgar Allan Poe
    V.S. Naipaul
    Vladimir Nabokov
    William Shakespeare
    William Langland
    Robert Greene
    
  • 0

    以下是 fileRead 的摘录 . 我只更改了行 (1) . 有了这个改变,据我所知,您的代码似乎按预期工作 .

    do{
      ....
      std::istringstream myStream( line );
    
      while ( myStream >> test ) // (1)
        results.push_back( test );
    } 
    while ( file.get() != '\n' )
    

    希望这可以帮助

相关问题