2014-01-28 2 views
0

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

//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 будет вашим лучшим выбором. – Jmc

+0

Из любопытства вы искали StackOverflow для «C++ read parse variable»? –

ответ

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

'while (! Fin.eof())' действительно плохой стиль, см. Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – Silex

1

Разбор текста - это не такая тривиальная вещь для реализации.

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

Если вы используете регулярное выражение, вам понадобится C++ 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. 
Смежные вопросы