0

私はintと2つの文字列を持つ構造を持っています。ファイルを読み込む場合、最初の 2 つの値はコンマで区切られ、最後の値は改行で終了します。ただし、3 番目の引数は空にすることができます。

ex data: 7, john doe, 123-456-7891 123 fake st.

私のプログラムが最初の数字を取得してintに入れ、コンマを見つけて2番目の数字を構造体の文字列に入れるようにしたい.

最初の質問は、代わりにクラスを使用する必要がありますか? 私は見ましたgetline(stream, myString, ',');が、私の引数は異なるデータ型であるため、それらをすべてベクトルに投げることはできません。

私のコード:

struct Person{
    int id;//dont care if this is unique 
    string name;
    string extraInfo;
};

int main(int argc, char* argv[]){
    assert( argc ==2 && "Invalid number of command line arguments");
    ifstream inputFile (argv[1]);
    assert( inputFile.is_open() && "Unable to open file");
}

この情報を格納し、最初の 2 つはコンマで区切られ、改行で終わるファイルから取得する最良の方法は何ですか? また、プログラムがファイル内の空白行を無視するようにします。

4

3 に答える 3

1

通常を使用してファイルを1行ずつ読み取りますgetline()stringstream次に、それをさらに解析するために に入れるか、stringfind()関数を使用してテキストを手動で分割します。

その他の注意事項:

  • クラスの使用に関する最初の質問がわかりません。を意味する場合Person、答えは問題ではないということです。
  • argc のように、制御できないものに assert を使用するのは間違っています。これは、プログラミング エラーが発生していないことを確認するためにのみ使用してください。また、NDEBUG を #define すると、アサートはすべてなくなるため、実際にはプログラム ロジックの一部であってはなりません。代わりに std::runtime_error("failed to open file") をスローします。
  • おそらく、文字列に二重引用符を入れたくないでしょう。また、"a,b"コンマで区切られたくない場合もあります。必要な機能をアサートするテストがあることを確認してください。
于 2013-05-21T03:07:34.197 に答える
0

getline行をトークン化するためのアプローチを引き続き使用できますが、最初に行を読む必要があります。

vector<Person> people;
string line;
int lineNum = 0;

while( getline(inputFile, line) )
{
    istringstream iss(line);
    lineNum++;

    // Try to extract person data from the line.  If successful, ok will be true.
    Person p;
    bool ok = false;

    do {
        string val;
        if( !getline(iss, val, ',') ) break;
        p.id = strtol( val.c_str(), NULL, 10 );

        if( !getline(iss, p.name, ',') ) break;
        if( !getline(iss, p.extraInfo, ',') ) break;

        // Now you can trim the name and extraInfo strings to remove spaces and quotes
        //[todo]

        ok = true;
    } while(false);

    // If all is well, add the person to our people-vector.
    if( ok ) {
        people.push_back(p);
    } else {
        cout << "Failed to parse line " << lineNum << ": " << line << endl;
    }
}
于 2013-05-21T03:07:44.827 に答える
0

getline を使用して文字列内の行を取得したら、strtok を使用します。

char myline[] = "7, john doe, 123-456-7891 123 fake st.";
char tokens = strtok(myline, ",");
while(tokens)
{
    //store tokens in your struct values here
}

#include <string.h>strtok を使用するには含める必要があります

于 2013-05-21T06:05:12.030 に答える