C++ 如何修改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

我有一个代码,用它我可以在屏幕上显示输出。但是,我想把输出放在一个文本文件中。坦白地说,我读过关于Lambda表达式的文章,但是我很难理解它的功能(因为我是初学者)

#包括
#包括
#包括
#包括
使用名称空间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