setprecision应用于旧的C样式代码

时间:2014-03-04 16:31:15

标签: c++ vector filestream precision cout

我知道在C ++中我可以使用setprecision,如下所示:

streamsize prec = cout.precision();

cout << "Your grade is: " << setprecision(3) << finalGrade << setprecision(prec);

如何将其改编为以下旧样式代码,尤其是在写入文件时?

for ( int k = 0 ; k < vector.size() ; k++ )
{
   fprintf( myFile, "%i\t%f\t%f\n", k+1, vector[k].x, vector[k].y );

   std::cout << vector[k].x << "\t" << vector[k].y;
}

我特别感到困惑的是setprecision(3)setprecision(prec)出现的顺序,当有多个变量时,就像vector个元素被写入的情况一样file ...

请有人帮我理解这个吗?

谢谢,

2 个答案:

答案 0 :(得分:3)

问题中不清楚您希望setprecision修改fprintf的工作方式;从评论中可以清楚地看出来。

这是不可能的(至少在现有的C ++标准库中)。

stdioiostreams系统是独立的,在C ++中大多是独立的部分。此外,iostreams内容已经 stdio之后标准化,因此支持setprecision影响fprintf意味着更改fprintf代码,没人想做。

要了解它们之间的区别,请查看ios_base::sync_with_stdio - 使fpritnfoperator<<互操作的专用函数。

要使您的系统正常工作,您可能需要将fprintf替换为operator<<。另一种方法是调整fprintf的格式字符串,但您必须在代码中添加对ios_base::sync_with_stdio的模糊调用。

答案 1 :(得分:1)

fprintf中指示小数位数的方法是%.[number]f;在您的情况下,对于3位小数,代码将是

fprintf( myFile, "%i\t%.3f\t%.3f\n", k+1, vector[k].x, vector[k].y );