解析String Array C ++的内容

时间:2009-01-23 06:17:03

标签: c++ parsing

我读了一个文件,并将其内容存储到字符串数组中。

我需要更改一些数值,由编译器解释为字符。

该文件的格式为:ABCDE,EFGHIJ KLMNOPQRS,45.58867,122.59750

我已经搜索过并研究过但没有太过全面。

如果有人可以告诉我该怎么做,我会很高兴。

我不允许使用strtod;我认为这是一个C函数,我的程序只需要严格的C ++。

这是我迄今为止开发的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <sstream>


using namespace std;


int main()
{

    string usrFileStr,
    fileStr = "airNames.txt",  // declaring an obj string literal
    sBuffer,
    sLine = "";

    istringstream iStrStrm;

    int lineCount = 1;
    int nStart;


    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() )
    {
          nStart = -1 ;
          cout << "First Str " << 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 << " (Second Str: "; // lattitude loop


          for ( int x = nStart + 1; x < sBuffer.length(); x++ )
          {
              if ( sBuffer[ x ] == ',' )
              {
                   nStart = x;
                   break;
                   }
              cout << sBuffer[ x ];         
          }

          cout << ", Third String: ";
          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 may close it

    fgetc( stdin );
    return 0;
}

我试过只读小数后的两位数,但我只得到一个字符。 我的第一次尝试是使用static_cast,但现在已经过时了。 而一个istringstream变量不会让它的参数成为一个数组。我不知道该怎么做..

5 个答案:

答案 0 :(得分:3)

std::stringstream

学会喜欢它。不是istringstream,因为你想从它获得输出。类似的东西:

getline ( inFile, sBuffer );
stringstream myStream(sBuffer);
string first, second, third;
char comma;

myStream >> first;  
myStream >> second;
myStream >> third;

float value1, value2;
myStream >> value1;
myStream >> value2;

另外,我建议您检查以确保文件实际打开。

答案 1 :(得分:1)

你想要stringstream,但是......

顺便说一句,在C ++程序的上下文中忽略C函数是愚蠢的。大多数OS函数都将作为C函数导出,而且C ++本身通常(总是?)编译成相当于C代码的东西,所以没有任何东西只能粘贴到C ++构造/函数上。一定要在适当的时候使用C ++提供的更高级别的抽象和方法,但如果你试图避免所有的C-linkage功能,那么你就没有充分的理由伤害自己。用什么有用;真正的编程很难,而不会超越自我限制。

当然,以上仅适用于现实世界的编程;家庭作业等可能是例外。 :)

答案 2 :(得分:0)

您也可以尝试使用boost regex, 请参阅:http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/captures.html

这样你就可以为','char添加一个reqex并捕获其中的值,甚至可以验证它们......

祝你好运!

答案 3 :(得分:0)

使用string.find()可以摆脱一些循环(它可能只在内部完成,但不需要重新发明轮子)。您可以使用字符串流将数字字符串转换为浮点数或双精度数。

答案 4 :(得分:0)

使用提升精神(http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/index.html)。花一点时间习惯,但如果你了解它就非常强大和有用。