Чтобы использовать код, который я написал для выполнения вычислений, мне нужно прочитать данные (числа и строки) из внешнего текстового файла и сохранить их в векторах либо строк, либо целых/двойных чисел. Я написал шаблонную функцию для этого. 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;
}
Спасибо