Я потратил много времени на поиск в Интернете, чтобы найти ответ для этого, но ничего не помогло, поэтому я решил, что опубликую свой конкретный сценарий. У меня есть.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
Некоторые простые подсказки в вашем коде помогут вам, вам нужно будет заполнить код. Но недостающие части легко найти в 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;
}
while(!fin.eof())
действительно плохой стиль, см. stackoverflow.com/questions/5605125/…
Разбор текста не является такой тривиальной задачей для реализации.
Если ваш формат не изменится, вы можете попытаться разобрать его самостоятельно, использовать доступ к файлу произвольного доступа и использовать регулярные выражения для извлечения части потока, который вам нужен, или прочитать определенное количество символов.
Если вы перейдете по регулярному выражению, вам понадобится С++ 11 или сторонняя библиотека, например Boost или POCO.
Если вы можете отформатировать текстовый файл, вы также можете выбрать стандарт для структурирования своих данных, например XML, и использовать средства этого формата для извлечения необходимой информации. POCO может вам помочь.
Если столбцы разделены пробелами, второй столбец первой строки пропускает второй токен, извлеченный из потока.
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.