解析数组C ++的内容

时间:2009-01-22 00:32:42

标签: c++

我有这个代码:

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) 但我想首先考虑这个价值问题。

4 个答案:

答案 0 :(得分:2)

看起来sBuffer是一个字符串或一个字符数组,所以当你打印sBuffer [x]时,它会把它当作一个字符而不是浮点数。

您需要将数字的字符串表示形式转换为double。您可以使用C中的atofstrtod函数,或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。