我想请求理论部分的一些帮助,所以研究这些齿轮,来吧
我想将一个文件加载到我的程序中,看起来像这样:
0,10,10#0,100,40...
好的,我现在要做的是取出每个以逗号分隔的数字并通过我的功能发送
void func(int,float,float);
主题标签意味着它是一个新的块,因此它将像func(0,10,10)一样发送,之后它将发送func(0,100,40)等等。
我正在考虑检查每个字符,直到我遇到','然后把它放在一个向量中,并继续直到'#'被满足。然后它会解雇我的函数(如func(v [0],v [1],v [2]),然后一遍又一遍地做同样的事情,直到EOF!
这是一个好方法吗?有更好的想法吗?这些数字也可能在以后变得非常大,所以我不知道我需要多少内存(因此向量)。或者我应该使用3个临时值和浮点数然后启动该函数并重新开始!
答案 0 :(得分:1)
使用char建立char并使用你建议的状态机是最快的方法
但最简单的方法是先按#
拆分,然后按,
拆分每个结果字符串。
您可以使用boost库来执行字符串split。
答案 1 :(得分:1)
#include <fstream>
#include <ostream>
#include <istream>
#include <stdexcept>
void func( std::vector<float> &numbers )
{}
int main() {
std::ifstream myfile("myfile.txt");
float number;
char seperator;
std::vector<float> numbers;
while( myfile >> number) { //read number
numbers.push_back(number); //and remember it
if (!(myfile >> seperator) || seperator == "#") { //if # or EOF or error
func(numbers); //run function
numbers.clear(); //and start over
}
} //only gets here at EOF or malformed file
return 0;
}
非常简单,快速,简单。
答案 2 :(得分:0)
如果您确定该文件以一组三个
中的第一个int开头ifstream fin("foo.csv");
string str;
stringstream s_str;
while(!fin.eof())
{
int a;
float b,c;
getline(fin,str,',');
s_str.str(str);
s_str >> a;
getline(fin,str,',');
s_str.str(str);
s_str >> b;
getline(fin,str,'#');
s_str.str(str);
s_str >> c;
}
应该有效。 (我没有编译它所以可能有拼写错误等)