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

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

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

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


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;
}

Спасибо

1 Ответ

1 голос
/ 01 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...