数值程序中使用C++流实现程序之间的数据传送

#if 0

在编写数值计算程序的过程中,经常需要大量的数值输入,通常来说是:一个程序用
于产生数据,另一个程序用来接收产生的数据作为输入。通常的做法是采用文件操作,但
是在我编写数值计算的过程中发现:C++中还可以用更加简单直接的方式实现这种数据传送
的目的。这种方法就是直接使用C++流库具备的输入输出能力,使得编码过程尽可能的简单
,这样就可以更加专注于算法的实现。

好了,说了这么多,我们来看看在实际的编写过程中该如何实现。

#endif
#ifdef SOURCE
//产生数据的源程序
//该程序仅仅只是输出两个数组的数据到标准输出流中
#include <iostream>
#include <iterator>
int main()
{
double A[10]={1,2,3,4,5,6,7,8,9,0};
double B[10]={0,9,8,7,6,5,4,3,2,1};
std::copy(A,A+10,std::ostream_iterator<double>(std::cout,"/n"));
std::cout << "*" << std::endl;//必须用一个分隔符来分隔多个数据
std::copy(B,B+10,std::ostream_iterator<double>(std::cout,"/n"));
return 0;
}
#endif//SOURCE
#ifdef TARGET
//接收数据的目标程序
//该程序仅仅只是从标准输入流中接收两个数组的数据到程序中的数组中。为了对比分别
//将两个数组的在从流中读取数据的前后向标准日志流中分别输出了两个数组中的数据。
#include <iostream>
#include <iterator>
int main()
{
double A[10]={0};
double B[10]={0};

//下面的代码和数据传送无关,仅仅输出初始的数据以给出初始数组值
std::copy(A,A+10,std::ostream_iterator<double>(std::clog," "));
std::clog << std::endl;
std::copy(B,B+10,std::ostream_iterator<double>(std::clog," "));
std::clog << std::endl;

//在下面这行代码从流中读取数据到A数组的时候,读到'*'时,流状态错误,停止读取
std::copy(std::istream_iterator<double>(std::cin),std::istream_iterator<double>(),A);
std::cin.clear(); //在这里恢复流状态为正常状态
std::cin.ignore(10,'*');//并且忽略掉至多10个字符,当遇到'*'的时候忽略慈字符之后停止忽略过程
//从当前的流中继续读取剩余的数据到B数组中
std::copy(std::istream_iterator<double>(std::cin),std::istream_iterator<double>(),B);

//下面的代码和数据传送无关,仅仅输出读入的数据以检查数据传送是否成功
std::copy(A,A+10,std::ostream_iterator<double>(std::clog," "));
std::clog << std::endl;
std::copy(B,B+10,std::ostream_iterator<double>(std::clog," "));

return 0;
}
#endif//TARGET

//以上代码的编译方法:
//g++ -DSOURCE file.cpp -o source
//g++ -DTARGET file.cpp -o target
//上面命令中的file.cpp指的使本文档
//这两个程序的运行方法如下:
//source|target
//这种运行方式的输出结果为:
/*******************************************************************************
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 2 3 4 5 6 7 8 9 0
0 9 8 7 6 5 4 3 2 1
*******************************************************************************/
//另外还可以分成两部分单独计算,这样可以节省运算时间。运行方式如下:
//source > source.txt
//target < source.txt >target.txt

#if 0

从上面的示例代码中可以看出:我直接使用了C++库存的流对象std::cout和std::cin
来完成数据传送任务,而程序运行中的提示信息通过std::clog的方式输出。这样就可以让
std::cout和std::cin专门负责数据传送同时也可以输出提示信息。职责分明,代码得到了
充分的简化。只有这样才可以使人们更加专注于编写小巧的程序,而不是大而全的程序,
读代码就像读文档一样,可以大大提高编码的效率和成功率。对于数值计算程序来说,将
程序的功能分成各个小的程序还有助于减少重复计算,加快运行速度。好了,说了这么多
在这里只是抛砖引玉,您的发挥将会给出更多更有用的方式:)

#endif
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值