我有这个代码:
cout << "Your Value is: ";
for ( int x = nStart + 1; x < sBuffer.length(); x++ )
{
if ( sBuffer[ x ] == ',' )
{
nStart = x;
break;
}
cout << sBuffer[ x ];
}
// setprecision doesnt work right when used with [] but i try anyway..
cout << setprecision(2) << sBuffer[ x ];
我的sBuffer [x]包含一个双精度值,比如4.1415679
我想使用setprecision(2)仅显示4.14
我卡住了,我该怎么办?
它不包含双,因为我正在阅读文本文件,我忘记提及抱歉。
我的文本文件格式为:
string,some string,49.59494,29.4094944
将逗号前的每个字段存储到sBuffer [x]。
所以我其实确实有一双。我认为它不起作用的原因是编译器将其解释为字符串或字符,而不是双值。
正确?
继承我的完整代码随时可以在dev或其他东西中编译,但一定要使用这种格式的文本文件:
String,Some String,54.2345,34.6654 ...
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>
#include <cstdlib>
using namespace std;
int main()
{
string usrFileStr,
fileStr = "test.txt", // declaring an obj string literal
sLine, // declaring a string obj
sBuffer;
int lineCount = 1;
fstream inFile; // declaring a fstream obj
// cout is the name of the output stream
cout << "Enter a file: ";
cin >> usrFileStr;
inFile.open( usrFileStr.c_str(), ios::in );
// at this point the file is open and we may parse the contents of it
while ( getline ( inFile, sBuffer ) && !inFile.eof() )
{
int nStart = -1 ;
cout << "First String " << lineCount << " (";
for ( int x = nStart + 1; x < sBuffer.length(); x++ )
{
if ( sBuffer[ x ] == ',' )
{
nStart = x;
break;
}
cout << sBuffer[ x ];
}
cout << ") ";
for ( int x = nStart + 1; x < sBuffer.length(); x++ )
{
if ( sBuffer[ x ] == ',' )
{
nStart = x;
break;
}
cout << sBuffer[ x ];
}
cout << " (First dValue";
for ( int x = nStart + 1; x < sBuffer.length(); x++ )
{
if ( sBuffer[ x ] == ',' )
{
nStart = x;
break;
}
cout << setprecision(2) << sBuffer[ x ];
}
cout << ", Second dValue: ";
for ( int x = nStart + 1; x < sBuffer.length(); x++ )
{
if ( sBuffer[ x ] == ',' )
{
nStart = x;
break;
}
cout << sBuffer[ x ];
}
cout << ") \n";
lineCount++;
}
cout << "There are a Total of: " << lineCount << " line(s) in the file."
<< endl;
inFile.clear(); // clear the file of any errors
inFile.close(); // at this point we are done with the file and we close it
fgetc( stdin );
return 0;
}
// use a funnction
是的,我知道我可以使用函数原型进行过度循环(4) 但我想首先考虑这个价值问题。
答案 0 :(得分:2)
看起来sBuffer是一个字符串或一个字符数组,所以当你打印sBuffer [x]时,它会把它当作一个字符而不是浮点数。
您需要将数字的字符串表示形式转换为double。您可以使用C中的atof
或strtod
函数,或boost::lexical_cast<double>
。
答案 1 :(得分:2)
看起来你的sBuffer[x]
不会包含一个double,你可以将它与','
进行比较。所以sBuffer
是字符的缓冲区?然后sBuffer[x]
只是你的“4.1415679”的一个字符,如果你输出这个字符,setprecision就不会做你想要的。
您可以使用stringstreams从字符串中读取double:
#include <sstream>
istringstream strm("4.1415679");
double d;
if (strm >> d) {
cout << "Your number: " << setprecision(2) << d << endl;
}
else {
cout << "Not a number." << endl;
}
如果您安装了boost个库(总是一个好主意),您也可以使用boost::lexical_cast<double>("...")
,就像Matthew Crumley所说的那样。
答案 2 :(得分:0)
您可能需要std::fixed
:
cout << fixed << setprecision(2) << sBuffer[ x ];
// ^^^^^
答案 3 :(得分:0)
如果sBuffer是一个chars数组,那么它不包含double。