2

実際には学生リストである一連のデータを含むテキスト ファイルがあります。
構造は「名前」「電話」「性別」「学生ID」「メール」のようなものです。

リストのサンプルを次に示します。

Roger Pont 70778745 男 20120345 hills@school.edu
Tommy Holness 5127438973 男 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu

データはテキスト ファイルに保存され、getline() 関数を使用して各行を文字列に変換しました。

つまり、student[0] には「Roger Pont 7077874567 M 20120345 hills@school.edu」が含まれています。

私の仕事は、StudentID に従って昇順でレコードを並べ替えることです。

私の問題は、文字列を異なる変数型に分割したかったことです。
ただし、いくつかの名前の間にはより多くのスペースがあり、電話番号は異なる長さで構成されているため、入力ストリームと出力ストリームを次のように使用することはできません:
stream >> name[i] >> tel[i] >>性別[i] >> StudentID[i] >> メール[i];

文字列を異なる変数に分割する方法はありますか?

前もって感謝します。

備考: これ ( Splitting a string into multiple variables in C++ ) を読みましたが、その場合とは異なり、年齢を表す整数の前に「年齢」という単語があるなどの特定のパターンはありません。

4

2 に答える 2

5
Roger Pont 70778745 M 20120345 hills@school.edu
Tommy Holness 5127438973 M 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu

上記のデータを見て、各行を逆方向に処理すると、問題は非常に簡単になります。

  • 単語を 1 行に分割します。単語数を としますN
  • 最後の単語は email、つまりwords[N-1]=> メールアドレス
  • 最後から 2 番目はStudentid、つまりwords[N-2]=> 学生 ID です。
  • 同様に、最後から 3 番目は性別、最後から 4 番目は電話、残りの単語は名前になります。

それはあなたに十分なヒントを与えました。

コード:

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <iterator>
#include <cassert>

struct student
{
  std::string name;
  std::string phone;
  std::string gender;
  std::string student_id;
  std::string email;
};

int main()
{
    std::vector<student> students;

    std::string line;
    while(std::getline(std::cin, line))
    {
        std::istringstream ss(line);
        std::istream_iterator<std::string> begin(ss), end;
        std::vector<std::string> words(begin, end); 

        assert(words.size() >= 5); 

        int n = words.size() - 1;
        student s { words[0], words[n-3], words[n-2], words[n-1], words[n] };
        for (int i = 1 ; i < n - 3 ; i++) s.name += " " + words[i];

        students.push_back(s);
    }

    //printing
    for(auto && s : students)
        std::cout << "name       = " << s.name  << "\n"
                  << "phone      = " << s.phone << "\n"
                  << "gender     = " << s.gender << "\n"
                  << "student_id = " << s.student_id << "\n"
                  << "email      = " << s.email << "\n\n";
}

入力:

Roger Pont 70778745 M 20120345 hills@school.edu
Tommy Holness 5127438973 M 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu

出力:

name       = Roger Pont
phone      = 70778745
gender     = M
student_id = 20120345
email      = hills@school.edu

name       = Tommy Holness
phone      = 5127438973
gender     = M
student_id = 20120212
email      = tommy@school.edu

name       = Lee Kin Fong
phone      = 864564456434
gender     = F
student_id = 30245678
email      = fong@school.edu

オンラインデモ

ここで、コードを理解するために少し時間を費やしてください。お見せしたコードは C++11 を使って書かれています。これは、Modern C++ の多くのイディオムを示しています。

  • ファイルの読み方. 1行ずつ。
  • 行を分割し、文字列のベクトルを設定する方法。
  • 構造体を埋める方法(問題固有)

それが役立つことを願っています。

于 2013-03-29T10:07:44.223 に答える
0
#include <iostream>
#include <vector>
#include <sstream>

using namespace std;

    std::vector<std::string> strings;
    std::istringstream f("Roger Pont 70778745 M  20120345 hills@school.edus");
    std::string s;
    while (std::getline(f, s, ' ')) {
        std::cout << s << std::endl;
        strings.push_back(s);
    }

これには、2 つの単語間の間隔が 1 スペース ' ' より大きいという問題があります。

于 2013-03-29T10:13:11.267 に答える