0

私の問題は、テキスト ファイルから char、string、int の順に入力しようとしていることです。getline() を使用して入力する方法は知っていますが、get line() 関数を使用した後、文字列に続く残りの整数を入力するオプションがなくなりました。私の質問は、どのように char を入力し、次に文字列 (スペースを含む) に続いて 3 つの int を入力できますか?

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(ドキュメントへのリンク)を使用することです。これは宿題のように聞こえるので、私はあなたのためにそれを解決したくありません(その中で楽しいところはどこですか?)が、値を文字列として取り込むことができます。必要に応じて、文字を一度に1つずつ手動で整数に変換し、数値を再構築することもできますが、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 に答える