C++: дополнительный вопрос по чтению из внешнего файла с использованием getline(). Как получить подмножество данных файла?
Мне нужно читать числа из внешнего файла и хранить их в векторе целых чисел. Я могу сделать это сейчас благодаря Говарду Хиннанту и Вильгельмтеллу, которые терпеливо помогли выяснить, почему мое кодирование не сработало вчера.
Я пытался выяснить, как включить в код дополнительную функцию, но я исчерпал свои знания о потоках и был бы признателен за некоторые советы.
Я хочу иметь возможность иметь дело с файлами, содержащими множество наборов данных. Можно ли извлечь только определенные данные из файла в вектор? Я хочу получить несколько векторов, которые содержат данные из разных частей файла. Я искал в Интернете, но не видел упоминаний об этом.
Вот код плюс пример файла (назовем его "тест"), из которого я хочу получить данные.
Изменить: я отредактировал код на основе совета 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"));
}
1 ответ
Когда вы достигнете начала блока, просто прочитайте до конца строки строку, затем проанализируйте строку.
std::getline( theStream, block, '\n' );
std::istringstream blockStream( block );
std::getline( blockStream, line, '\'' ); // etc