C ++ новичок (потоки) ... Как читать строки из файла, где строка имеет пробел (например, Том Смит)?Проблема с использованием getline вместо >> - PullRequest
4 голосов
/ 19 марта 2011

Я написал шаблонную функцию для чтения строковых или числовых данных из файлов и сохранения данных в векторах либо строк, либо целых / двойных чисел. Затем я использую данные для выполнения расчетов с другим кодом, который я написал.

Заранее извиняюсь, потому что я думаю, что это простой вопрос ... Я не могу прочитать в строковых данных, где есть пробел ... Например, имя и фамилия. Когда я хочу «Том Смит», я получаю только «Том»). Из поиска в Google кажется, что проблема в том, что >> и что я должен использовать 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 голос
/ 19 марта 2011

Я написал код для решения части вашей проблемы: синтаксический анализ имен. Вы можете адаптировать его к вашим потребностям. Примечание: это не самый быстрый способ решить эту проблему, но это простой способ, который, мы надеемся, легко понять.

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'

Результаты

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 голосов
/ 19 марта 2011

Ниже приводится выдержка из fileRead.Я изменил только строку (1).С этим изменением, насколько я вижу, ваш код, кажется, работает так, как вы ожидаете.

do{
  ....
  std::istringstream myStream( line );

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

Надеюсь, это поможет

...