Я прочитал несколько сообщений StackExchange и других страниц о преобразовании строк в целые числа, но это не работает. Это последнее, что я пробовал:
if (infile.is_open())
{
while (getline (infile,line))
{
regex_match(line,matches,exp);
regex_match((string)matches[1], time0, exp_time);
buffer << time0[1];
str = buffer.str();
str.append("\0");
cout << atoi(str.c_str()) << '\n';
last_match = matches[2];
buffer.str(string());
}
infile.close();
}
Я не могу придумать никаких других способов. Я попробовал обычное преобразование в строку в char * в целое число. Я попытался преобразовать его в строку, а затем использовать stoi(), чтобы преобразовать его в целое число. Я попытался добавить к нему символ NULL ("\ 0"), я также попытался добавить его в буфер. Я также пробовал atof() и stof(). stoi() и stof() приводят к сбою программы. atoi() и atof() всегда возвращают 0.
Вот SSCCE с указанной проблемой (atoi(str.c_str())
не должно быть равно 0):
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <sstream>
using namespace std;
int main(int argc, char* argv[])
{
regex exp("^(.+),(.+),.+,.+,(.+),.+,.+$");
regex exp_time("^(.+)-(.+)-(.+)");
smatch matches;
smatch time0;
string line;
ifstream infile(argv[1]);
string last_match;
stringstream buffer;
string str;
int i = 0;
if (infile.is_open())
{
while (getline(infile, line))
{
regex_match(line, matches, exp);
regex_match((string)matches[1], time0, exp_time);
buffer << time0[1];
str = buffer.str();
str = time0[1].str();
str.append("\0");
cout << atoi(str.c_str()) << " " << time0[1] << '\n';
last_match = matches[2];
buffer.str(string());
i++;
}
infile.close();
}
return 0;
}
Входными данными будет файл csv со следующими значениями:
1996-09-04,19.00,19.25,18.62,18.87,528000,0.79
1996-09-03,19.00,19.37,18.75,19.00,1012800,0.79
1996-08-30,19.87,20.12,19.37,19.62,913600,0.82
1996-08-29,20.87,21.12,19.75,19.75,1987200,0.82
1996-08-28,20.12,22.12,20.12,21.12,5193600,0.88
1996-08-27,19.75,20.37,19.75,20.12,1897600,0.84
1996-08-26,20.12,20.12,19.75,19.75,388800,0.82
1996-08-23,19.75,20.25,19.75,19.75,1024000,0.82
1996-08-22,18.62,20.00,18.25,19.87,1921600,0.83
1996-08-21,19.12,19.25,18.25,18.62,688000,0.78
1996-08-20,19.62,19.62,19.12,19.12,494400,0.80
1996-08-19,19.37,19.62,19.37,19.62,428800,0.82
1996-08-16,19.50,19.87,19.12,19.37,864000,0.81
Вы бы запустили программу с program.exe filename.csv
Вот более короткая программа с более очевидными проблемами:
time0
иmatches
? Также всегда полезно предоставить SSCCE. - person TobiMcNamobi   schedule 30.01.2014atoi(...)
; использоватьboost::lexical_cast<int>()
; (2) Не используйте приведения в стиле C [(string)
]; - person kingtorus   schedule 12.02.2014regex_match
принимает строковый параметр по постоянной ссылке. Приведение его создает временное, которое может исчезнуть при возврате вызова функции; (4) См. здесь небольшое изложение того, как использовать функцию str() для типа совпадения (а также итератор совпадений) regex; вы можете использовать cmatch вместо smatch, если хотите использовать c-строки старого стиля; - person kingtorus   schedule 12.02.2014