2016-04-05 7 views
0

入力ファイル:入力ファイルを読み込んでデータを配列に保存する(初心者)!

1 4 red 
2 0 blue 
3 1 white 
4 2 green 
5 2 black 

私がやりたいことは、すべての行を取り、2次元配列にそれを格納しています。例えば :それに取り組んで

array[0][0] = 1 
array[0][1] = 4 
array[0][2] = red 
array[1][0] = 2 
array[1][1] = 0 
array[1][2] = blue 
etc.. 

コードはIAM:

#include <iostream> 
    #include <fstream> 
    #include <string> 
    #include <sstream> 
    #include <vector> 

    using namespace std; 

    int convert_str_to_int(const string& str) { 
     int val; 
     stringstream ss; 
     ss << str; 
     ss >> val; 
     return val; 
    } 


    string getid(string str){ 

     istringstream iss(str); 
     string pid; 
     iss >> pid; 
     return pid; 
    } 
    string getnumberofcolors(string str){ 
     istringstream iss(str); 
     string pid,c; 
     iss >> pid>>c; 
     return c; 
    } 

    int main() { 
     string lineinfile ; 
     vector<string> lines; 

     ifstream infile("myinputfile.txt"); 
     if (infile) { 
      while (getline(infile , lineinfile)) { 
      lines.push_back(lineinfile); 
      } 
     } 
     //first line - number of items 
     int numofitems = convert_str_to_int(lines[0]); 

     //lopps items info 
     string ar[numofitems ][3]; 
     int i = 1; 

     while(i<=numofitems){ 
      ar[i][0] = getid(lines[i]); 
      i++; 
     } 
     while(i<=numofitems){ 
      ar[i][1] = getarrivel(lines[i]); 
      i++; 
     } 

     infile.close() ; 
     return 0 ; 
    } 

ループ私のプログラムが何らかの理由で動作を停止している間、私は第二を追加! これを解決するには、他の方法、またはプログラムの解決方法があります。

答えて

0

それはあなたがより良いそれを行う方法を示すために良いでしょう:

#include <fstream> 
#include <string> 
#include <vector> 

using namespace std; 

int main() { 
    ifstream infile("myinputfile.txt"); // Streams skip spaces and line breaks 

    //first line - number of items 
    size_t numofitems; 
    infile >> numofitems; 

    //lopps items info 
    vector<pair<int, pair<int, string>> ar(numofitems); // Or use std::tuple 

    for(size_t i = 0; i < numofitems; ++i){ 
     infile >> ar[i].first >> ar[i].second.first >> ar[i].second.second; 
    } 

    // infile.close() ; // Not needed -- closed automatically 
    return 0 ; 
} 

あなたはおそらく、単純なアルゴリズムのタスクのいくつかの種類を解決しています。 std::pairstd::tupleを見てください.2つの要素のコンテナとしてだけでなく、自然な比較演算子のためにも便利です。

0

答えはあなたのものよりはるかに優れています。私はあなたの設計上の欠陥のいくつかを指摘し、それを改善するためのヒントをいくつか挙げるべきだと思った。

  • はすでに std::stoi()は、文字列を整数に変換することで、標準、中に存在する機能を再定義しました。関数 がすでに存在する場合は、それを再利用することはOKですが、 が既に発明されていることを再考する必要はないと思います。あなたがよく分からない場合は、あなたの好きなC++リファレンスガイドを検索してください。
  • 解決策は、データを完全な文字列として保存している間は、そのままの状態でデータを保存します。これは本当に意味をなさない。データがあらかじめわかっているので、それをあなたの利益に利用してください。さらに、そのようなデータ行を格納するときには、解析、変換、および構築が必要になる前に構築する必要がありますが、ソリューションではデータは一度しか構築されません。
  • データの形式は事前にわかっているので、情報を読み込むためのより良い方法は、入出力演算子とともに構造体を定義することです。これは、このようになります:

    意思のない質問は彼らではありません
    ... 
    MyData tmp; 
    outfile << tmp; 
    vData.push_back(tmp); 
    ... 
    

    、我々は明らかにストリームからのデータ型を読み込み、保存されている:あなたは、単にこのような何かを行うことができ

    その後
    struct MyData 
    { 
        int   num1; 
        int   num2; 
        std::string color; 
    
        friend std::ostream& operator << (std::ostream& os, const MyData& d); 
        friend std::istream& operator >> (std::istream& os, const MyData& d); 
    }; 
    

    それはコンテナ内にある。何かあれば、元の解決策または提供された解決策よりも、自分が行っていることがより明確になります。

関連する問題