C++ 如何修改Lambda表达式以将输出放在文本文件中?
我有一个代码,用它我可以在屏幕上显示输出。但是,我想把输出放在一个文本文件中。坦白地说,我读过关于Lambda表达式的文章,但是我很难理解它的功能(因为我是初学者)C++ 如何修改Lambda表达式以将输出放在文本文件中?,c++,lambda,c++14,generic-lambda,C++,Lambda,C++14,Generic Lambda,我有一个代码,用它我可以在屏幕上显示输出。但是,我想把输出放在一个文本文件中。坦白地说,我读过关于Lambda表达式的文章,但是我很难理解它的功能(因为我是初学者) #包括 #包括 #包括 #包括 使用名称空间std; #包括 使用矩阵=std::vector; void addRow(矩阵&M、常量整数rowNum、常量整数id、常量浮点类型、常量浮点x、常量浮点y、常量浮点z){ M[rowNum][0]=id; M[rowNum][1]=类型; M[rowNum][2]=x; M[rowN
#包括
#包括
#包括
#包括
使用名称空间std;
#包括
使用矩阵=std::vector;
void addRow(矩阵&M、常量整数rowNum、常量整数id、常量浮点类型、常量浮点x、常量浮点y、常量浮点z){
M[rowNum][0]=id;
M[rowNum][1]=类型;
M[rowNum][2]=x;
M[rowNum][3]=y;
M[rowNum][4]=z;
}
int main(){
弦线;
浮球x0、y0、z0、x1、y1、z1,类型;
int NUMBER_line=0,id=0,NUMBER_line 1=0,NUMBER_line 3=0;
ofstream secondoutput;//输出文本文件
secondoutput.open(“secondoutput.txt”);//输出文本文件
ifstream myfile(“1.lammpstrj”);
字符串名称文件;
如果(myfile.is_open()){
对于(int-lineno=0;getline(myfile,line)&&lineno<7;lineno++){
如果(lineno==2)myfile>>编号\u行;
}
cout>类型>>x0>>y0>>z0;
addRow(输入0,linenoq,id,类型,x0,y0,z0);
}
对于(int i=0;i>NUMBER_line1;
}
矩阵输入1(数字线1,标准::向量(5));
对于(int linenoq=0;getline(myfile,line)&&linenoq>id>>类型>>x1>>y1>>z1;
addRow(Input1,linenoq,id,type,x1,y1,z1);
}
矩阵输出(数字线,标准::向量(5));
对于(行大小=0;行
不管怎样,没有输入文件的内容很难帮助您
在代码中有一个问题;在lambdas中
[](auto const& row) {
std::for_each(row.cbegin(), row.cend(),
[](const float value) {
cout << value << " ";
secondoutput << value << " "; // the output text file
});
cout << endl;
secondoutput << "\n" ; // the output text file
}
因此,您可以通过引用捕获所有内容(也可以是secondoutput
)
额外的未请求的建议:注意,正如eike所建议的那样,您可以避免捕获、lambdas和std::for_each()
简单地使用ranged for循环(另外还有eike的建议,以避免多次刷新)
for(自动常量和行:输出)
{
用于(自动常量和值:行)
{
我永远不会理解为什么在这种情况下,有人会对每个循环使用,而不是对循环使用ranged for。你可以编写for(const auto&row:Output){for(const auto&value){cout…;secondoutput…},而不是对每个循环和lambda表达式使用
@eike你是我的吗?如果我将这些替换为_,那么代码可以创建一个文本文件并将输出放入其中?我强烈建议不要使用std::endl
进行换行,因为这包括每次使用时的刷新。如果你不是在一个不稳定的环境中,需要获得完整的数据,只需使用'\n'
程序崩溃前的输出。标准流在销毁时刷新。@eike-好的一点:在外部循环的末尾添加了一个std::flush
;谢谢。在那里编辑我的评论有点晚。流在销毁时刷新,所以你根本不需要显式刷新。@eike-另一个好的一点;这次我将它作为一个co添加mment(如果我展示了一个程序片段……也许有人可以用更复杂的代码复制它,std::flush
)可能会有用。亲爱的@max66非常感谢你对我的帮助。还有你和“eike”对换行有什么好的评论
// .....V add &
[&](auto const& row) {
std::for_each(row.cbegin(), row.cend(),
[&](const float value) {
/* add & .....^ */ cout << value << " ";
secondoutput << value << " "; // the output text file
});
cout << endl;
secondoutput << "\n" ; // the output text file
}
for ( auto const & row : Output )
{
for ( auto const & value : row )
{
std::cout << value << ' ';
secondoutput << value << ' ';
}
std::cout << '\n';
secondoutput << '\n';
}
std::cout << std::flush; // you can avoid it, because you're ending the program
secondoutput << std::flush; // you can avoid it, because you're closing the file