C ++: дополнительный вопрос по чтению из внешнего файла с использованием getline ().Как получить подмножество данных файла? - PullRequest
0 голосов
/ 15 февраля 2011

Мне нужно прочитать числа из внешнего файла и сохранить их в векторе целых чисел.Теперь я могу сделать это благодаря Говарду Хиннанту и Вильгельмтеллу, которые терпеливо помогли выяснить, почему мое кодирование вчера не работало.Я исчерпал свои знания о потоках и был бы признателен за некоторые советы.

Я хочу иметь возможность работать с файлами, содержащими множество наборов данных.Можно ли извлечь только определенные данные из файла в вектор?Я хочу получить несколько векторов, которые содержат данные из разных частей файла.Я искал в Интернете, но не видел упоминаний об этом.

Вот код плюс пример файла (назовем его «тест»), из которого я хочу получить данные.


Редактировать: Я редактировал код, основываясь на совете 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 Ответ

0 голосов
/ 15 февраля 2011

Когда вы достигнете начала блока, просто прочитайте до конца строки строку, затем проанализируйте строку.

...