Мне нужно прочитать числа из внешнего файла и сохранить их в векторе целых чисел.Теперь я могу сделать это благодаря Говарду Хиннанту и Вильгельмтеллу, которые терпеливо помогли выяснить, почему мое кодирование вчера не работало.Я исчерпал свои знания о потоках и был бы признателен за некоторые советы.
Я хочу иметь возможность работать с файлами, содержащими множество наборов данных.Можно ли извлечь только определенные данные из файла в вектор?Я хочу получить несколько векторов, которые содержат данные из разных частей файла.Я искал в Интернете, но не видел упоминаний об этом.
Вот код плюс пример файла (назовем его «тест»), из которого я хочу получить данные.
Редактировать: Я редактировал код, основываясь на совете CashCow.Теперь я могу получить блок из файла данных.Но я не знаю, как получить блок, который я хочу.Если я запускаю код как есть, я получаю вектор, содержащий элементы 2,5,8 (это не то, что я хочу).Чтобы получить vectorTwo (4,5,6 в моем примере), я попытался добавить это вокруг оператора while:
if( line == "vectorTwo" )
{
// The while statement and its contents
}
Это не сработало.Я не получил никаких результатов от запуска кода (хотя он скомпилирован).Кто-нибудь может увидеть в чем проблема?Я подумал, что мог бы использовать этот оператор для поиска заголовка нужного мне блока данных.
// Вот содержимое файла примера
vectorOne // Идентификатор дляподмножество данных для одного вектора
'1' '2' '3'
vectorTwo // Как бы я получил этот один вектор?Или любой другой вектор?
'4' '5' '6'
vectorThree // Идентификатор подмножества данных для другого вектора
'7' '8' '9'
// Код: Символ '\' 'является разделителем строк.Все игнорируется до первого «а затем все до следующего» является частью числа.Это продолжается до тех пор, пока не выйдет из строя логика (конец файла).Как я могу заставить его остановиться в конце блока данных?
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
int main()
{
std::string line;
std::string block; // Edited, from CashCow
const std::string fileName = "test.dat";
std::ifstream theStream( fileName.c_str() );
if( ! theStream )
std::cerr << "Error opening file test.dat\n";
std::vector<int> numbers; // This code is written for one vector only. There would be three vectors for the example file I provided above; one for the vectorOne data in the file, and so on.
while (true)
{
// get first '
std::getline(theStream, line, '\'');
// read until second '
std::getline(theStream, line, '\'');
std::istringstream myStream( line );
std::getline( theStream, block, '\n' ); // Edited, from CashCow
std::istringstream blockstream( block ); // Edited, from CashCow
std::getline(blockstream, line, '\''); // Edited, from CashCow
int i;
myStream >> i;
if (myStream.fail())
break;
numbers.push_back(i);
}
std::copy(numbers.begin(), numbers.end(),
std::ostream_iterator<int>(std::cout, "\n"));
}