从字符串中提取不同的数据类型变量

时间:2015-04-07 20:27:52

标签: c++

我试图在这里弄脏文件IO。我能做基本的事情,但有点用尽了。 我想从文本文件中读取输入。文本文件的每一行都遵循以下格式:<int> <char> <string literal> <float>,如果它没有被忽略。

对于每一行,我们需要将变量存储为四种数据类型:

int i;
char c;
std::string  s;
float f;

打印出来。对于下一行,它们会被覆盖并再次打印。

这是我的尝试:

int main() {
    int i;
    char c;
    std::string  s, x;
    float f;
    ifstream in;
    in.open("Input.txt");
    if(in) {
        std::getline(in,x);
        // How do I extract i, c, s and f components from x now?
        cout << "\nInteger:" << i << ", Character: " << c << ", String: " 
             << s << ", Float: " << f << endl; 
    }
    return 0;
}

PS:尽管存在效率瓶颈,但请仅使用基本概念来解决此问题,而不是高级问题。

1 个答案:

答案 0 :(得分:2)

您可以这样做:

while(in >> i >> c >> s >> f)
{
    cout << "\nInteger:" << i << ", Character: " << c << ", String: " 
         << s << ", Float: " << f << endl; 
}

如果您的值以逗号分隔,则可以使用std::stringstream / std::getline组合来解析令牌(std::getline允许指定分隔符),如下所示:

std::stringstream ss; // from <sstream>
int field = 0; 
while (std::getline(in, ss, ','))
{
    switch (field)
    {
    case 0:
        ss >> i; 
        break;
    case 1:
        ss >> c;
        break;
    case 2: 
        ss >> s;
        break;
    case 3:
        ss >> f;
        break;
    }
    if(++field == 4)
        field = 0;
}

或者,您可以阅读整行,删除逗号(std::remove_if),将转换后的行发送到stringstream,然后执行ss >> i >> c >> s >> f