2

次のようなテキスト ファイル内の属性のデータセットを使用しています。

e,x,y,w,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,s,g
e,f,y,y,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,n,y,p
e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,n,s,g
e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,k,s,m
e,x,y,n,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,k,y,g
e,b,s,w,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,k,s,g
e,x,f,g,f,n,f,c,n,g,e,e,s,s,w,w,p,w,o,p,n,y,u
e,b,s,y,t,l,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,s,g

今、特定の列から文字を簡単に読み取る方法を見つけようとしています。たとえば、3 列目から読み取る場合、出力は「yyssysfs」になります。私はそれを行う方法を理解することはできません。私に何ができるか知っている人はいますか?

4

4 に答える 4

1

正確には、列の定義は何ですか。通常の定義では、3 列目の文字の "xfbbxbxb"リストは となります (2 列目の文字のリストは となります",,,,,,,,")。あなたが望むのは、3 番目のフィールドの文字のリストです。

列内の文字のリストの場合、解決策は簡単です。行ごとに読み取り ( std::getline)、列番号を使用して行にインデックスを付けます (もちろん、行が実際に十分に長いことを確認した後)。

フィールド内の文字のリストについては、各行をフィールドに分割し、おそらく結果を に入れ、 std::vector<std::string>次にこのベクトルにインデックスを付ける必要があります。

これが下手な宿題の問題で、1) 各フィールドが正確に 1 文字であり、2) フィールドが 1 つのコンマで区切られ、追加の空白がないことが保証されている場合、フィールドを列にマップできます2 * fieldId - 1 (桁)。これを行うと、列内の文字に対してソリューションを使用できます。

于 2012-12-06T15:29:15.607 に答える
1

これは、iostream のダーク内部を使用したソリューションです。

struct dataset_ctype : std::ctype<char>
{
  mask table[table_size];
public:
  dataset_ctype(size_t refs = 0) : std::ctype<char>(table, false, refs) {
    std::fill(table, table+table_size, (mask)alpha);
    table[','] = (mask)space;
  }
};

int main()
{
  std::string inp = 
    "e,x,y,w,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,s,g\n"
    "e,f,y,y,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,n,y,p\n"
    "e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,n,s,g\n"
    "e,b,s,w,t,a,f,c,b,w,e,c,s,s,w,w,p,w,o,p,k,s,m\n"
    "e,x,y,n,t,l,f,c,b,w,e,r,s,y,w,w,p,w,o,p,k,y,g\n"
    "e,b,s,w,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,k,s,g\n"
    "e,x,f,g,f,n,f,c,n,g,e,e,s,s,w,w,p,w,o,p,n,y,u\n"
    "e,b,s,y,t,l,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,s,g\n";

  std::istringstream is(inp);
  is.imbue(std::locale(is.getloc(), new dataset_ctype));

  const int column = 2;
  while (is) {
    std::istream_iterator<std::string> ii(is);
    std::advance(ii, column);
    std::cout << *ii << '\n';
    is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  }
}
于 2012-12-06T15:02:32.537 に答える
1

各行を一度に 1 つずつ読み、おそらくコンマを削除して、std::vector. 3 番目の列を取得するには、ベクター内のすべての文字列をループして、文字列から 3 番目 (カンマが削除されている場合) の文字を取得します。

于 2012-12-06T14:57:36.353 に答える
0

を使用std::ifstreamしてファイルを開き、条件が、 が であるwhileループを作成します。文字が行のどの位置にあるかは、列番号 から(最初の列が の場合)だけであると判断できます。行からその文字を取得するには、. 行を解析する必要はまったくありません。次に、各行から取得した文字を にプッシュします。std::getline(file,line)linestd::stringi2 * ii == 0std::string::operator[]std::vector<char>

于 2012-12-06T15:02:36.250 に答える