2016-12-09 9 views
-3

をC++私はこのような可変長配列の複数のアレイを持つファイルがあります:どのようにファイルから複数の整数配列を読み取るためには

15 
1 5 2 7  
8 4 9  
53 21 60 4 342 4321 
... 

をするようのは、最初の数(15)は配列の数を与えるとしましょう理解するのが簡単です(すべてがランダムですが)。 ファイルからC++のすべての数値を読み込み、それらを変数に入れるには、x [100] [100]とすると、x [1] [1] + x [2] [2]私に14(5 + 9)を与えるでしょう。私は行末まで読むことを考えましたが、柱を追跡する方法がわかりません

+0

各行を別々のベクトルに置き、ベクトル要素を計算します。 – Lukasz

答えて

1

int x[100][100]これらの要素のうちのいくつかだけが必要ですが、使用されないメモリがかなりあります(まだ存在し、を初期化する必要があります)。

これに対する解決策は、ポインタと動的割り当てです。最初の行を読んだら、正しい量の「サブアレイ」を割り当てることは簡単です。この問題は、サブアレイのすべての要素が可変数であるように見えるため、サブアレイをどのように処理するかによって発生します。サブアレイごとに一定量の要素を割り当てることができます。さらに必要ないことを願っています(初期化が必要な無駄なメモリの問題を取り戻す)。入力上で2つのパスを実行すると、問題のいくつかを緩和することができます.1つは行の要素の最大数を取得し、もう1つは実際にデータを読み取ることです。

2番目のオプションは、各行に十分な要素を読み取り、動的に割り当てることです。これには、入力が解析され、行が終了したことを知る必要があります。また、新しい番号を追加するときに再割り当てを使用する必要があります。また、各サブアレイの要素数を追跡して、外出するリスクを回避する必要があります。

各行の要素数を追跡するには、秒の配列をカウントに使用するか、あるいは、構造体の配列を代わりに使用することもできます。各構造体には、要素の数と各行のサブ配列が含まれています。


(私はこれはC++に気づいたということになりました - タグ付けされた質問ではなくC)よりよい解決策あなたはstd::vectorを使用する必要があります。むしろベクトルのベクトル(int)です。

最初の行を読み、その番号を解析すると、必要なサブベクトルの数が分かり、事前に割り当てることができます。

そして、それはstd::getlinestd::istringstreamstd::istream_iteratorとC++で非常にに簡単である、データの残りの部分を読んだだけの問題です。

おそらく、このような何か:もちろん

std::string line; 

// Get the first line, the amount of extra lines to read 
std::getline(input_file, line); 

// Create the vector (of vectors) 
std::vector<std::vector<int>> data; 

size_t number_of_sub_vectors = std::stoi(line); 

// Preallocate memory for the sub-vectors 
data.reserve(number_of_sub_vectors); 

// Now read the data for each line 
for (size_t i = 0; i < number_of_sub_vectors; ++i) 
{ 
    // Get the data for the current line 
    std::getline(input_file, line); 

    // And put into an input string stream for parsing 
    std::istringstream iss(line); 

    // Create the sub-vector in-place, and populate it with the data from the file 
    data.emplace_back(std::istream_iterator<int>(iss), 
         std::istream_iterator<int>()); 
} 

上記の例では、本当に必要とされる、エラー処理のいずれかの種類を持っていません。

+0

私はベクトルを使用するとより良い行配列になると思います。例えば、配列のサイズを数えるために配列を追加する必要はありません。代わりにvectorのsize()メソッドを使ってください。 – Lukasz

+0

@Lukaszああ、これはC++の質問だったことに気付かなかった。 :ベクトルは自然な解です。 –

+0

だから... getline()を使って文字列型にする。次に、この文字列を解析してベクトルを供給します。このステップをファイルの終わりまで繰り返します:D – Lukasz

関連する問題