2009-01-22 8 views
-1

Je possède ce code:contenu Parse de tableau 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 ]; 

Et mon sBuffer [x] contient une valeur double, disons, 4,1415679

Je veux utiliser SetPrecision (2) pour afficher seulement 4,14

Je suis coincé, que puis-je faire?


il ne contient pas un double parce que je suis en train de lire un fichier texte, que j'ai oublié de mentionner désolé.

mon fichier texte a ce format:

chaîne

, une chaîne de caractères, 49,59494, 29,4094944

stocker chaque champ avant une virgule dans le sBuffer [x].

donc j'ai en fait un double. La raison pour laquelle je pense que ça ne marche pas, c'est que le compilateur l'interprète comme une chaîne, ou un caractère, et non une double valeur.

à droite?

Heres mon code complet ne hésitez pas à compiler en dev ou quelque chose, mais assurez-vous d'utiliser le fichier texte avec ce format:

cordes, ficelle, 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 

Ouais je sais que je pourrais utiliser un prototype de fonction pour la boucle excessive (4) Mais je voudrais d'abord prendre soin de cette question de valeur.

Répondre

0

Vous voulez probablement std::fixed:

cout << fixed << setprecision(2) << sBuffer[ x ]; 
//  ^^^^^ 
0

Si sBuffer est un tableau de caractères, il ne contient pas de double.

2

Il semble que sBuffer soit une chaîne ou un tableau de caractères, donc quand vous imprimez sBuffer [x], il le traite comme un caractère au lieu d'un nombre à virgule flottante.

Vous devez convertir la représentation sous forme de chaîne du nombre en un double. Vous pouvez utiliser les fonctions atof ou strtod de C ou boost::lexical_cast<double>.

2

Il ne semble pas que votre sBuffer[x] contienne un double, vous le comparez à ',' après tout. Donc sBuffer est un tampon de caractères? Puis sBuffer[x] est juste un caractère de votre "4.1415679" et setprecision ne fera pas ce que vous voulez si vous venez de sortir ce personnage.

Vous pouvez utiliser stringstreams lire un double d'une chaîne:

#include <sstream> 

istringstream strm("4.1415679"); 
double d; 

if (strm >> d) { 
    cout << "Your number: " << setprecision(2) << d << endl; 
} 
else { 
    cout << "Not a number." << endl; 
} 

Si vous avez les bibliothèques installées boost (toujours une bonne idée), vous pouvez aussi utiliser boost::lexical_cast<double>("..."), comme Matthew Crumley dit.