我有一个文件,其数据列表如下:
0, 2, 10
10, 8, 10
10, 10, 10
10, 16, 10
15, 10, 16
17, 10, 16
Run Code Online (Sandbox Code Playgroud)
我希望能够输入文件并将其拆分为三个数组,在此过程中修剪所有多余的空格并将每个元素转换为整数.
出于某种原因,我无法在c ++中找到一种简单的方法.我唯一的成功就是将每一行输入到一个数组中,然后重新修整所有空格然后将其拆分.整个过程花了我很多20-30行代码,并且修改另一个分隔符(例如空格)等很难.
这是我希望在C++中使用的python:
f = open('input_hard.dat')
lines = f.readlines()
f.close()
#declarations
inint, inbase, outbase = [], [], []
#input parsing
for line in lines:
bits = string.split(line, ',')
inint.append(int(bits[0].strip()))
inbase.append(int(bits[1].strip()))
outbase.append(int(bits[2].strip()))
Run Code Online (Sandbox Code Playgroud)
在python中使用这种方法的难易程度是我首先转向它的原因之一.但是,我现在需要在C++中执行此操作,我不想使用我丑陋的20-30行代码.
任何帮助将不胜感激,谢谢!
在这个例子中没有真正需要使用boost,因为流可以很好地完成这个工作:
int main(int argc, char* argv[])
{
ifstream file(argv[1]);
const unsigned maxIgnore = 10;
const int delim = ',';
int x,y,z;
vector<int> vecx, vecy, vecz;
while (file)
{
file >> x;
file.ignore(maxIgnore, delim);
file >> y;
file.ignore(maxIgnore, delim);
file >> z;
vecx.push_back(x);
vecy.push_back(y);
vecz.push_back(z);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然如果我打算使用boost我更喜欢tokenizer的简单性来正则表达式... :)
fscanf 确实没有问题,这可能是这种情况下最快的解决方案。它和 python 代码一样简短易读:
FILE *fp = fopen("file.dat", "r");
int x, y, z;
std::vector<int> vx, vy, vz;
while (fscanf(fp, "%d, %d, %d", &x, &y, &z) == 3) {
vx.push_back(x);
vy.push_back(y);
vz.push_back(z);
}
fclose(fp);
Run Code Online (Sandbox Code Playgroud)