【发布时间】:2021-09-19 23:29:39
【问题描述】:
我有一个包含这样数据的文件
10000 9.425 1.00216 -0.149976
20000 19.425 0.973893 -0.135456
30000 29.425 1.01707 -0.115423
40000 39.425 1.0181 -0.12074
.
.
.
要获取数据,我正在做的是读取整行,然后用空格分隔行以获取我需要的数据。问题是该文件有 3000 行,所以我试图在 for 循环中获取该行
std::vector<std::string> a;
std::ifstream datas("Data/thermo_stability.dat");
std::string str;
char d=' ';
for(int i=0; i<n; i++)
{
std::getline(datas, str);
tokenize(str,d,a);
x[i]=std::atof((a[1]).c_str());
y[i]=std::atof((a[3]).c_str());
std::cout << x[i] << "\t" << y[i] << std::endl;
}
我注意到出了点问题,所以我添加了那个 cout,发现它总是在同一行。我该如何解决这个问题?为什么在调用 getline 后没有得到下一行?当我在循环之外执行它时,它会转到下一行。
编辑
这是标记化的函数
void tokenize(std::string &str, char delim, std::vector<std::string> &out)
{
size_t start;
size_t end = 0;
while ((start = str.find_first_not_of(delim, end)) != std::string::npos)
{
end = str.find(delim, start);
out.push_back(str.substr(start, end - start));
}
}
【问题讨论】:
-
你怎么知道它没有得到下一行。您不会打印出
str。看起来更像tokenize()无法将字符串读入a但我们无法判断,因为您没有显示该功能。 -
请edit 这个问题包含minimal reproducible example。此代码可能工作或失败,具体取决于此处未显示的部分。
-
我添加了tokenize功能。