0

我的问题是我试图从文本文件中输入字符、字符串然后是 int。我知道如何使用 getline() 进行输入,但是在使用 getline() 函数之后,不再有输入字符串后面的其余整数的选项。我的问题是,如何输入一个字符,然后是一个字符串(带空格),后跟 3 个整数?

data.txt 看起来像这样

a   New York    5    7   9
b   Virginia    10   2   5
c   Los Angeles 25   15  6

这是我的代码:

   int main()
   {
    string city;
    double price;
    int amt1, amt2, amt3;
    char orderStatus;

    ifstream warehouse;
    ofstream output;
    warehouse.open("data.txt");
    output.open("dataOut.txt");

    while (warehouse.good()) 
    {
        warehouse >> orderStatus;
        output << orderStatus << "\t";

        getline(warehouse, city, '\t');
        //warehouse >> city;
        output << city << endl;

        //warehouse >> amt1;
        //output << amt1 << "\t";

        //warehouse >> amt2;
        //output << amt2 << "\t";

        //warehouse >> amt3;
        //output << amt3;
    }


    warehouse.close();
    output.close();

    return 0;
   }

感谢您非常需要的帮助。

4

2 回答 2

1

一个快速的解决方案是使用atoi(链接到文档)。这听起来像家庭作业,所以我不想为你解决它(这有什么乐趣?)但你可以将值作为字符串拉入。如果您愿意,您还可以一次手动将字符转换为整数并重建数字,但atoi会处理所有这些。我猜这些是 std::string,所以你必须调用c_str()它们,因为 atoi 只接受 C 字符串。

于 2012-06-15T21:56:44.403 回答
1

这是我对您的代码的编辑。我添加了一个warehouse >> noskipws >> orderStatus >> skipws;跳过第一个制表符分隔符。此外,if(!warehouse.good()) break;在每次读取后添加一个以防数据不完整。如果是C,我会做fscanf(file, " %c %[^\t]s %d %d %d", ...)的。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    string city;
    double price;
    int amt1, amt2, amt3;
    char orderStatus;

    ifstream warehouse;
    ofstream output;
    warehouse.open("data.txt");
    output.open("dataOut.txt");

    while (warehouse.good()) 
    {
        warehouse >> orderStatus; 
        if(!warehouse.good()) break;
        output << orderStatus << "\t";
        // to skip the tab delimiter
        warehouse >> noskipws >> orderStatus >> skipws;
        if(!warehouse.good()) break;

        getline(warehouse, city, '\t');
        if(!warehouse.good()) break;
        output << city << "\t";

        warehouse >> amt1;
        if(!warehouse.good()) break;
        output << amt1 << "\t";

        warehouse >> amt2;
        if(!warehouse.good()) break;
        output << amt2 << "\t";

        warehouse >> amt3;
        if(!warehouse.good()) break;
        output << amt3 << endl;
    }


    warehouse.close();
    output.close();

    return 0;
}
于 2012-06-15T22:22:17.180 回答