如何从文本文件c ++中读取具有一定长度空格的输入字符串

时间:2012-06-15 21:22:28

标签: c++

我的问题是我正在尝试从文本文件中输入char,string和int。我知道如何使用getline()输入,但是在使用get line()函数之后,不再有选项来输入字符串后面的其余整数。我的问题是,如何输入一个字符,然后输入一个字符串(带空格)后跟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;
   }

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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;
}