我有一个文件,例如:
1.0000000e+01 8.0123000e+01 1.0000000e+01 1.0000000e+01 1.0000000e+01
-1.0000000e+01 1.0000000e+01 1.0001110e+01 1.0000000e+01 1.0000000e+01
1.0000000e+01 1.0000000e+01 -5.0000000e+01 1.0000000e+01 1.0000000e+01
//... (repeated scientific numbers)
1 2 3 4
2 4 5 60
100 3 5 63
//... (repeated integer numbers)
我想从C ++文件中读取这些数字,但只有科学格式的数字,所以我需要在数字格式发生变化时停止代码。我也有这个优点,浮点数有5列,而整数有4列。
那么,在C ++中最好的方法是什么?
答案 0 :(得分:2)
忽略EOL(继续读取整数):
typedef double d[5] Datum;
Datum d;
vector<Datum> data;
while (true) {
Datum t;
istr >> t[0] >> t[1] >> t[2] >> t[3] >> t[4];
if (!istr) break;
data.push_back(t);
}
使用列数和EOL:
while (istr) {
string line;
getline(istr, line);
Datum t;
istringstream temp(line);
temp >> t[0] >> t[1] >> t[2] >> t[3] >> t[4];
if (temp.fail()) break;
data.push_back(t);
}
答案 1 :(得分:0)
您可以使用strstr在每行中搜索“e +”。
http://www.cplusplus.com/reference/clibrary/cstring/strstr/
如果你想更加花哨,你可以使用正则表达式库(例如boost :: regex),它也可以帮助你从每一行中提取字符串。
答案 2 :(得分:0)
恐怕没有直接的方法可以做到这一点。也就是说,您无法以特定格式输入(>>
)浮点数。因此,如果您需要该功能,则必须将这些行读作字符串,然后手动解析它们。当然,这并不意味着您必须逐位构建一个浮点数。一旦确定了要从中读取浮动的输入文件的边界,请使用stringstreams
来读取它们。
答案 3 :(得分:0)
您可以使用正则表达式仅匹配您关注的人:-?\d+\.\d+e[+-]\d+
我确信这不是最好的方法,但如果表现不是一个大问题,那么这是一个简单的出路
警告:自动生成RegexBuddy的代码
pcre *myregexp;
const char *error;
int erroroffset;
int offsetcount;
int offsets[(0+1)*3]; // (max_capturing_groups+1)*3
myregexp = pcre_compile("-?\\d+\\.\\d+e[+-]\\d+", 0, &error, &erroroffset, NULL);
if (myregexp != NULL) {
offsetcount = pcre_exec(myregexp, NULL, subject, strlen(subject), 0, 0, offsets, (0+1)*3);
while (offsetcount > 0) {
// match offset = offsets[0];
// match length = offsets[1] - offsets[0];
if (pcre_get_substring(subject, &offsets, offsetcount, 0, &result) >= 0) {
// Do something with match we just stored into result
}
offsetcount = pcre_exec(myregexp, NULL, subject, strlen(subject), 0, offsets[1], offsets, (0+1)*3);
}
} else {
// Syntax error in the regular expression at erroroffset
}
答案 4 :(得分:-1)
正则表达式是最好的方法,或者你可以试试 fscanf ()