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
Другие вопросы по тегам