можно ли читать с определенного символа в строке из файла в С++?

Привет всем, поэтому мне нужно получить значения из текстового файла, но значения не автономны, все они записываются следующим образом:

Численность населения: 30

Есть ли способ в С++, который я могу прочитать после ':'? Я пробовал использовать оператор >>, например:

string pop;
inFile >> pop;

но, конечно, пробел завершает оператор до того, как он доберется до числа и по какой-то причине использует

inFile.getline(pop, 20);

дает мне множество ошибок, потому что по какой-то причине он не хочет писать напрямую в строку. Я действительно не хочу использовать массив символов, потому что тогда будет не так просто проверить число и извлечь его только из строка. Так я могу использовать функцию getline со строкой? И можно ли читать после символа ':'?

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <cstdlib>

using namespace std;
int main()
{
    string fname;
    cin >> fname;
    ifstream inFile;
    inFile.open(fname.c_str()); 
    string pop1;
    getline(inFile,pop1);
    cout << pop1;
    return 0;
}

Итак, вот мой код с новой строкой getline, но он по-прежнему ничего не выводит. он правильно открывает текстовый файл и работает с массивом символов


person Hendrik Human    schedule 03.11.2012    source источник
comment
Существует версия getline для std::string, которая не является членом входных потоков: std::getline(inFile, pop).   -  person Joseph Mansfield    schedule 03.11.2012
comment
спасибо за помощь, это утверждение не вызывает никаких ошибок, но ничего не выводит, когда я использую cout ‹‹ pop;   -  person Hendrik Human    schedule 03.11.2012
comment
Единственная причина сбоя: 1) Вы ввели неправильное имя файла (поэтому файл не открылся корректно) 2) Файл был пуст 3) Первая строка в файле пуста. Добавьте проверку ошибок, чтобы убедиться, что файл открывается. Затем распечатайте каждую строку в файле с помощью: while(std::getline(inFile, pop1)) { std::cout << "Line: " << pop1 << "\n";}   -  person Martin York    schedule 03.11.2012


Ответы (2)


Вероятно, вам лучше всего прочитать всю строку, а затем манипулировать строкой: -

std::string line;
std::getline(inFile, line);
line = line.substr(19);  // Get character 20 onwards...

Вам, вероятно, лучше искать двоеточие: -

size_t pos = line.find(":");
if (pos != string::npos)
{
    line = line.substr(pos + 1);
}

Или что-то подобное

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

int population;
std::istringstream ss(line);
ss >> population;

Очевидно, все зависит от того, что вы хотите делать с данными.

person jcoder    schedule 03.11.2012
comment
спасибо, да, я так и думал. поэтому для строки вы используете getline(inFile, line) вместо inFile.getline(pop, 20);? прохладно - person Hendrik Human; 03.11.2012
comment
хорошо, поэтому, когда я использую этот код, ошибок нет, но если я cout ‹‹ строки; это ничего не показывает - person Hendrik Human; 03.11.2012
comment
Нет. Весь смысл операторов потока заключается в том, чтобы избежать подобных манипуляций со строками. да прочитайте строку за один раз, но используйте строковый поток для анализа данных - person Martin York; 03.11.2012

Предполагая, что ваши данные находятся в форме

 <Key>:<Value>

По одному на строку. Тогда я бы сделал так:

std::string line;
while(std::getline(inFile, line))
{
    std::stringstream  linestream(line);

    std::string key;
    int         value;

    if (std::getline(linestream, key, ':') >> value)
    {
        // Got a key/value pair
    }
}
person Martin York    schedule 03.11.2012
comment
Похоже, пробел между двоеточием и значением, но я думаю, что это нормально. - person Steve Jessop; 03.11.2012
comment
@SteveJessop: потоки будут правильно обрабатывать лишние пробелы после двоеточия. Так что не проблема. - person Martin York; 03.11.2012
comment
спасибо, ключевая часть не имеет значения, мне нужны только цифры, потому что они входят в GA. Что меня действительно убивает, так это то, что этот getline(inFile, line) ничего не хранит внутри моей строки - person Hendrik Human; 03.11.2012
comment
@ user1763722: Вероятно, это потому, что у вас есть пустая строка при вводе. Обычно это вызвано смешиванием вызовов std::getline() и operator>>. Но чтобы действительно ответить на этот вопрос, нужно правильно задать вопрос. Предоставьте код, который вы используете (он должен быть компилируемым) с входными данными. Тогда мы сможем точно сказать вам, почему он терпит неудачу. - person Martin York; 03.11.2012
comment
@user1763722: user1763722: Кажется, также есть некоторая путаница в том, какую версию getline вы используете. Ваш вопрос указывает на stream.getline(), но ваши комментарии, кажется, указывают на то, что std::getline() это две совершенно разные функции. - person Martin York; 03.11.2012
comment
int main() { строка fname; cin ›› fname; если поток в файле; inFile.open(fname.c_str()); строка поп1; getline (в файле, pop1); cout ‹‹ pop1; вернуть 0; } - person Hendrik Human; 03.11.2012