Получение определенного раздела из строки в файле (C ++)

0

Я потратил много времени на поиск в Интернете, чтобы найти ответ для этого, но ничего не помогло, поэтому я решил, что опубликую свой конкретный сценарий. У меня есть.txt файл (см. Ниже), и я пытаюсь написать процедуру, которая просто находит определенный фрагмент определенной строки (например, я хочу получить 5-значное число из второго столбца первой строки). Файл открывается отлично, и я могу читать все это, но я просто не знаю, как получить определенные куски из строки. Какие-либо предложения? (ПРИМЕЧАНИЕ. Эти имена и номера являются вымышленными...)

//main cpp file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    ifstream fin;
    fin.open("customers.txt");



    return 0;
}

//customers.txt
100007     13153     09067.50     George F. Thompson
579489     21895     00565.48     Keith Y. Graham
711366     93468     04602.64     Isabel F. Anderson
  • 0
    Просто из любопытства, это должен быть C ++? Или вы можете использовать утилиту командной строки? Если вы просто пытаетесь решить эту конкретную проблему, лучшим выбором будет awk на linux.
  • 0
    Из любопытства вы искали в StackOverflow «переменная синтаксического анализа чтения C ++»?
Теги:
fstream
ifstream

3 ответа

0
Лучший ответ

Некоторые простые подсказки в вашем коде помогут вам, вам нужно будет заполнить код. Но недостающие части легко найти в stackoverflow.

//main cpp file
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

splitLine(const char* str, vector<string> results){
    // splits str and stores each value in results vector
}

int main()
{
    ifstream fin;
    fin.open("customers.txt");
    char buffer[128];
    if(fin.good()){
        while(!fin.eof()){
            fin.getline(buffer, 256);
            cout << buffer << endl;

            vector<string> results;         
            splitLine(buffer, results);
            // now results MUST contain 4 strings, for each 
            // column in a line
        }

    }
    return 0;
}
1

Разбор текста не является такой тривиальной задачей для реализации.

Если ваш формат не изменится, вы можете попытаться разобрать его самостоятельно, использовать доступ к файлу произвольного доступа и использовать регулярные выражения для извлечения части потока, который вам нужен, или прочитать определенное количество символов.

Если вы перейдете по регулярному выражению, вам понадобится С++ 11 или сторонняя библиотека, например Boost или POCO.

Если вы можете отформатировать текстовый файл, вы также можете выбрать стандарт для структурирования своих данных, например XML, и использовать средства этого формата для извлечения необходимой информации. POCO может вам помочь.

0

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

std::ifstream input{"customers.txt"}; // Open file input stream.
std::istream_iterator<int> it{input}; // Create iterator to first token.
int number = *std::next(it);          // Advance to next token and dereference.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню