Как разобрать кавычки и запятую в переполнении стека

У меня есть огромный файл для разбора. Ранее он был отделен либо space или же comma и я использовал sscanf(string, "%lf %lf ", &aa, &bb); чтобы получить данные в мою программу.

Но теперь формат данных изменен на "122635.670399999","209705.752799999", с запятой и кавычками. И я понятия не имею, как с этим бороться. На самом деле, мой предыдущий код был найден в сети, и мне было очень трудно найти подходящий документ для такого рода проблем. Будет здорово, если вы порекомендуете мне их. Благодарю.

2

Решение

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

// here's our ctype facet:
class my_ctype : public std::ctype<char> {
public:
mask const *get_table() {
static std::vector<std::ctype<char>::mask>
table(classic_table(), classic_table()+table_size);

// tell it to classify quotes and commas as "space":
table['"'] = (mask)space;
table[','] = (mask)space;
return &table[0];
}
my_ctype(size_t refs=0) : std::ctype<char>(get_table(), false, refs) { }
};

Используя это, мы можем прочитать данные примерно так:

int main() {
// Test input from question:
std::string input("\"122635.670399999\",\"209705.752799999\"");

// Open the "file" of the input (from the string, for test purposes).
std::istringstream infile(input);

// Tell the stream to use the locale we defined above:
infile.imbue(std::locale(std::locale(), new my_ctype));

// Read the numbers into a vector of doubles:
std:vector<double> numbers{std::istream_iterator<double>(infile),
std::istream_iterator<double>()};

// Print out the sum of the numbers to show we read them:
std::cout << std::accumulate(numbers.begin(), numbers.end(), 0.0);
}

Обратите внимание, что после того, как мы наполнили поток локалью, используя наш фасет ctype, мы можем просто читать числа, как будто запятые и кавычки вообще не существуют. Поскольку фасет ctype классифицирует их как пробелы, они полностью игнорируются, за исключением действия в качестве разделителей между другими вещами.

Я указываю на это прежде всего, чтобы прояснить, что после этого нет никакой магии в какой-либо обработке. Там нет ничего особенного в использовании istream_iterator вместо (например) double value; infile >> value; если вы предпочитаете делать это. Вы можете читать числа любым способом, которым вы обычно читаете числа, которые были разделены пробелами — потому что, насколько заботится поток, это именно так что у тебя есть.

4

Другие решения

если у вас есть данные, разделенные запятыми в строках, просто удалите " из строки как:
скажем, строка str1

str1.erase(std::remove(str1.begin(), str1.end(), '"'), str1.end());

это сотрет все случаи "

    //Use below code to convert string into float
float f1;
std::stringstream ss;
ss<<str1;
ss>>f1;
1

По вопросам рекламы [email protected]