从文件中逐行读取条件
conditional line-by-line reading from file
现在我有那个代码:
if (minimizator_weighted) {
while (dataFile >> t >> e >> sigma) { // read data file value by value
/* some code */
}
}
else {
while (dataFile >> t >> e) { // all the same but will not read standard deviation
/* almost the same code */
}
}
您可以看到if
和else
流量之间的唯一区别是while
循环的条件。我想知道是否有可能优化该片段并重新使用代码?如果我能写出某种:
while ((minimizator_weighted) ? (dataFile >> t >> e >> sigma) : (dataFile >> t >> e)) { ... }
但是我不确定这个技巧是否正确...您能告诉我一些优化吗?谢谢!
编辑这是完整的代码片段
if (minimizator_weighted) {
while (dataFile >> t >> e >> sigma) { // read data file value by value
data_set::pt point;
point.t = t;
point.e = e;
point.c_vis = 0.0;
point.c_invis = 0.0;
if (std::abs(sigma) <= GSL_SQRT_DBL_MIN) // check for division-by-zero error
sigma = 1.0;
point.sigma = sigma;
set.curve.push_back(point); // store point
data_numPoints++; // collect some stats
set.curveAvg += e;
}
}
else {
while (dataFile >> t >> e) { // all the same but will not read standard deviation
data_set::pt point;
point.t = t;
point.e = e;
point.c_vis = 0.0;
point.c_invis = 0.0;
set.curve.push_back(point);
data_numPoints++;
set.curveAvg += e;
}
}
添加一个间接水平
bool read_data_line1(istream& dataFile, T& t, E& e, Sig& sigma)
{ return dataFile >> t >> e >> sigma; }
bool read_data_line2(istream& dataFile, T& t, E& e, Sig&)
{ return dataFile >> t >> e; }
auto read_data_line_func = minimizator_weighted ? read_data_line1 : read_data_line2;
while(read_data_line_func(dataFile, t, e, sigma))
{
data_set::pt point;
point.t = t;
point.e = e;
point.c_vis = 0.0;
point.c_invis = 0.0;
if (minimizator_weighted)
{
if (std::abs(sigma) <= GSL_SQRT_DBL_MIN) // check for division-by-zero error
sigma = 1.0;
point.sigma = sigma;
}
set.curve.push_back(point); // store point
data_numPoints++; // collect some stats
set.curveAvg += e;
}
我想我会表达这样的东西:
data_set::pt collect_point(std::istream& is, bool minimizator_weighted)
{
data_set::pt point;
is >> point.t >> point.e;
point.c_vis = 0.0;
point.c_invis = 0.0;
if (minimizator_weighted) {
is >> point.sigma;
point.sigma = std::max(point.sigma, GSL_SQRT_DBL_MIN);
}
return point;
}
void test()
{
int data_numPoints = 0;
data_set set;
while (dataFile)
{
auto point = collect_point(dataFile, minimizator_weighted);
auto e = point.e;
set.curve.push_back(std::move(point)); // store point
data_numPoints++; // collect some stats
set.curveAvg += e;
}
}
您的体系结构向我们展示了3件错误:
-
sigma
是某些对象的未使用变量 - 对象行为由外部变量(
minimizator_weighted
)
决定 -
minimizator_weighted
必须每次访问这些对象之一
这些是基本的设计缺陷,不仅使您在这里付出了代价,而且在整个程序中损失了。该修复程序将需要进行reachiptuction。让我向您展示如何做到这一点,您可以决定是否要继续解决问题或解决架构。
首先您需要 2 基本类型,1 st 将与您已经定义的没有sigma
的data_set::pt
匹配,然后我们将使用data_set::pt_weighted
扩展添加sigma
:
struct pt {
double t;
double e;
double c_vis;
double c_invis;
};
struct pt_weighted : pt {
double sigma;
};
现在我们要编写提取操作员,再次以data_set::pt
的提取操作符开始,并将其扩展为data_set::pt_weighted
:
istream& operator>> (istream& lhs, data_set::pt& rhs) {
rhs.c_vis = 0.0;
rhs.c_invis = 0.0;
return lhs >> rhs.t >> rhs.e;
}
istream& operator>> (istream& lhs, data_set::pt_weighted& rhs) {
lhs >> static_cast<data_set::pt&>(rhs) >> rhs.sigma;
// check for division-by-zero error
if(std::abs(rhs.sigma) <= GSL_SQRT_DBL_MIN) rhs.sigma = 1.0;
return lhs;
}
从这里开始,您需要开始使用模板。首先,您需要将set.curve
示为data_set::pt
或data_set::pt_weighted
的容器,然后您的功能需要更改为:
template <typename T>
void foo() {
for(T point; dataFile >> point;) {
set.curve.push_back(point); // store point
data_numPoints++; // collect some stats
set.curveAvg += point.e;
}
}
如果您无法在运行时建立minimizator_weighted
,则需要致电foo
,例如:
minimizator_weighted ? foo<data_set::pt_weighted>() : foo<data_set::pt>();
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 输入未正确读取条件语句
- 是否可以将结构与条件语句完全相同的字符串转换为可以读取和操作的语句?
- absl::Mutex 的条件关键部分如何处理读取器唤醒
- 启动子进程时的争用条件导致从管道读取挂起
- 提升 asio async_read_until在匹配条件下停止读取
- 从文件中逐行读取条件
- 会读取的种族条件会同时改变读取和书写的数据
- c++ 读取左 IF 语句条件和右语句条件
- 我应该使用什么条件来停止文件读取循环
- 有条件地从std输入或文件中读取文件
- 有没有办法只从C++中的stdin读取满足某些条件的字符
- 当条件读取该行时执行此操作
- c++从文件中读取:使用.fail()或try/catch的if条件
- c++用条件语句读取文本文件