C++: чтение данных из внешнего файла; проблема с моим кодом для остановки чтения до конца файла

Чтобы использовать код, который я написал для выполнения вычислений, мне нужно прочитать данные (числа и строки) из внешнего текстового файла и сохранить их в векторах либо строк, либо целых/двойных чисел. Я написал шаблонную функцию для этого. CashCow, Howard Hinnant и wilhelmtell любезно помогли решить предыдущую проблему.

Функция работает нормально для целых и двойных чисел, но у меня проблема со строковыми данными.

Мне нужны данные из ОДНОЙ строки моего внешнего файла, чтобы перейти в вектор, но функция читает несколько строк. Вот что я имею в виду. Допустим, это то, что находится во внешнем текстовом файле (ниже):


vectorOne // Идентификатор подмножества данных для одного вектора

'1' '2' '3' // Эти значения должны войти в один вектор (vectorOne)

vectorTwo // Идентификатор подмножества данных для другого вектора (vectorTwo)

'4' '5' '6' // Эти значения должны попасть в другой вектор

vectorThree // Идентификатор подмножества данных для другого вектора (vectorThree)

'7' '8' '9' // Эти значения должны попасть в другой вектор


Если я ищу идентификатор/метку подмножества данных (например, vectorOne), я хочу, чтобы в мой результирующий вектор попадали только данные на следующей строке. Проблема в том, что ВСЕ данные ниже идентификатора/метки попадают в результирующий вектор. Итак, если мне нужен vectorTwo, я ожидаю, что мой результирующий вектор будет содержать элементы «4, 5, 6». Но вместо этого он содержит от 4 до 9. В моем коде (ниже) я думал, что строка:

while ( file.get() != '\n' );

гарантировал, что чтение остановится на новой строке (т.е. после каждой строки данных).

Я был бы очень признателен за любые предложения относительно того, что происходит не так.

Вот код (для наглядности я настроил его для строк):

#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& temp )  
{   
    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 >> temp;
                results.push_back( temp );
            } 
            while ( file.get() != '\n' );
        }
    }
}


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

    std::vector<string> results;

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

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

    return 0;
}

Спасибо


person user616199    schedule 28.02.2011    source источник


Ответы (1)


Мне кажется, у вас могут быть проблемы с смешиванием getline и get.

Когда вы прочитали имя нужного вам вектора, вы начинаете читать части, заключенные в одинарные кавычки. После того, как вы прочитали все, что заключено в одинарные кавычки, вы проверяете, является ли следующий символ концом строки. Если в строке перед новой строкой есть что-то еще, тест завершается неудачей и считывается все, что находится между следующей парой одинарных кавычек. Если в конце строки есть комментарий, или пробел, или что-то еще после последней одинарной кавычки, то, что у вас есть, потерпит неудачу.

Попробуйте прочитать всю строку в строку, а затем прочитать ее как поток строк. Таким образом, вы не сможете пройти дальше конца строки.

person David Thornley    schedule 28.02.2011
comment
Давид, большое спасибо! В моем внешнем текстовом файле у меня нет комментариев в конце строки, но у меня ДЕЙСТВИТЕЛЬНО был пробел! Я избавился от пробела, и теперь код работает как положено. Я просто не мог понять, почему что-то не работает! Очень благодарны. - person user616199; 01.03.2011