需要在C ++中解析字符串的基本帮助

时间:2010-02-02 02:51:03

标签: c++ file-io

C ++不是我的首选语言。

我有一个包含此文件的文件:

e 225,370 35,75

我想将e,225,370,35和75彼此分成char和ints,但我遇到了麻烦。我尝试了在网上和我的C ++书中找到的所有内容,但仍然无法解决问题。请帮忙。

我会更容易用Java做这件事。

7 个答案:

答案 0 :(得分:13)

C++ String Toolkit Library (StrTk)针对您的问题提供了以下解决方案:

int main()
{ 
   std::string data("e 225,370 35,75");
   char c1;
   int i1,i2,i3,i4;
   strtk::parse(data,", ",c1,i1,i2,i3,i4);
   return 0;
}

可以找到更多示例Here

答案 1 :(得分:4)

如果您可以控制格式,如果您删除了逗号,那么它(稍微)会更容易阅读,只需输入

  

e 225 370 35 75

使用这种格式,Poita_用于读取数据的代码将起作用[编辑:他自从更新他的代码以明确阅读并跳过逗号]。否则,您需要明确地跳过逗号:

char ingore1, ignore2;
char ch;
int i[4];

file >> ch >> i[0] >> ignore1 >> i[1] >> i[2] >> ignore2 >> i[3];

[编辑:如果您是偏执或真的需要验证您的输入,此时您可以检查ignore1ignore2是否包含逗号。]

但是,在大多数情况下,数据可能是相关的,因此您需要将整行读入单个结构(或类)中:

struct data { 
    char ch;
    int i[4];

    std::istream &operator>>(std::istream &is, data &d) { 
        char ignore1, ignore2;
        return is >> ch >> i[0] >> ignore1 >> i[1] >> i[2] >> ignore2 >> i[3];
    }
};

完成此操作后,您可以一次读取整个data对象:

std::ifstream infile("my data file.txt");
data d;

infile >> d;

或者,如果您有一个完整的文件,您可以将它们全部读入矢量:

std::vector<data> d;

std::copy(std::istream_iterator<data>(infile), 
    std::istream_iterator<data>(),
    std::back_inserter(d));

答案 2 :(得分:3)

如果要使用旧式C运行时

FILE * pf = fopen(filename, "r");
char e;
int  a, b, c, d;
int ii = fscanf(pf, "%c %d,%d %d,%d", &e, &a, &b, &c, &d);
if (ii < 5) 
   printf("problem in the input file");
fclose (pf);

编辑:根据来自 dreamlax

的评论添加错误检查

答案 3 :(得分:2)

假设您已将数据读入字符串......

  1. strchr就像String.index。
  2. strtol就像Integer.parseInt()
  3. 你还需要什么?

答案 4 :(得分:2)

#include <fstream>

/* ... */

ifstream file;
file.open("yourfile.txt");
char c, dummy;
int i[4];
file >> c >> i[0] >> dummy >> i[1] >> i[2] >> dummy >> i[3];
file.close();

答案 5 :(得分:2)

使用Boost Tokenizer分割字符串。我假设只有第一个令牌是char,所以示例代码如下:

#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>
#include <vector>

using namespace std;

...

typedef boost::tokenizer<boost::char_separator<char> > tokenizer;

string teststring("e 225,370 35,75");
boost::char_separator<char> separators(", ");
tokenizer tokens(teststring, separators);
vector<string> substrings;
for (tokenizer::iterator iter = tokens.begin(); iter != tokens.end(); ++iter)
{
    substrings.push_back(*iter);
}

并且,瞧,你有一个整齐的矢量中的所有子串。 char在子字符串[0]中作为std :: string,并且以下int值在子字符串[1]和后面的那些中,也作为std :: string。您需要将它们转换为整数值。为此我建议你看看stringstream。

答案 6 :(得分:-2)

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
        ifstream f("a.txt"); // check for errors.

        char ch,dummy;
        int i1,i2,i3,i4;

        f>>ch>>i1>>dummy>>i2>>i3>>dummy>>i4;

        cout<<ch<<endl<<i1<<endl<<i2<<endl<<i3<<endl<<i4<<endl;

        return 0;
}