2016-04-16 15 views
3

私は2つのファイルの番号を取り、昇順に別のファイルに出力するプログラムを作成することになっています。プログラムはエラーなしでコンパイルし、必要に応じて出力ファイルを作成しますが、ファイルは空です。私は間違って何をしていますか?C++マージファイルの問題

まずファイル:

1 
3 
5 
7 
9 

セカンドファイル:

2 
4 
6 
8 

-

#include <iostream> 
#include <fstream> 
#include <cstdlib> 
using namespace std; 

void merging(ifstream& instream, ifstream& instream2, ofstream& outstream); 

int main() 
{ 
    ifstream instream, instream2; 
    ofstream outstream; 

    instream.open("merge1"); 
    if (instream.fail()) 
    { 
     cout << "Failed to open input file.\n"; 
     exit (1); 
    } 

    instream.open("merge2"); 
    if (instream2.fail()) 
    { 
     cout << "Failed to open input file.\n"; 
     exit (1); 
    } 

    outstream.open("merge3"); 
    if (outstream.fail()) 
    { 
     cout << "Failed to open output file.\n"; 
     exit (1); 
    } 

    merging(instream, instream2, outstream); 

    instream.close(); 
    instream2.close(); 
    outstream.close(); 

    cout << "Finished merging files.\n"; 

    return 0; 
} 

void merging(ifstream& instream, ifstream& instream2, ofstream& outstream) 
{ 
    int number1, number2; 

    if (instream >> number1) 


    if(instream) 
    { 
     if (instream2 >> number2) 
    { 

     while (instream && instream2) 
     { 
      if (number1 <= number2) 
      { 
      outstream << number1 << " "; 
      } 

      if (! (instream >> number1)) 
      { 
      outstream << number2 << " "; 

      } 

     } 

      else 
     { 
      outstream << number2 << " "; 


      if (! (instream >> number1)) 
      { 
       outstream << number1 << " "; 

      } 
      else 
     } 
     } 
    } 
     else 
    { 
     outstream << number1 << " "; 

    } 
    } 

    while (instream >> number1) 
    { 
     outstream << number1 << " "; 

    } 

    while (instream2 >> number2) 
    { 
     outstream << number2 << " "; 

    } 


} 
+0

標準の 'sort'ツールにはすでにこの機能があります。 –

+0

ファイル1から['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)に読み込み、ファイル2から同じベクトルに読み込みます。 ['std :: sort'](http://en.cppreference.com/w/cpp/algorithm/sort)でベクトルを実行します。ベクトルをファイル3に書き込みます。 – user4581301

+0

デバッガは優れたツールです。あなたが1つを使用することを学んでいない場合、これは素晴らしい機会になります。個々のステートメントを個別に実行する*変数の値を監視する*。 StackOverflowに投稿する前に1つを使うことを強くお勧めします。 –

答えて

3

問題がここにあります:

instream.open("merge1"); 
... 
instream.open("merge2"); 

instreamを2回開いた。

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <algorithm> 

... 
std::vector<int> vec; 

int i; 
while (instream1 >> i) 
    vec.push_back(i); 

while (instream2 >> i) 
    vec.push_back(i); 

//sort the values 
std::sort(vec.begin(), vec.end()); 

//output 
for (auto n : vec) 
    outstream << n << "\n"; 
+0

ありがとう、ありがとう、私はインストリーム2の後にインストリーム2を開くことを意味しました。修正後、出力ファイルには数字が含まれていましたが、少数のファイルが故障していました。あなたが見つけたものに似た間違いを探しました。ここで私は次のように書きました:if(!(instream >> number1)){outstream << number1 << ""; }の代わりにif(!(インストリーム>> number1)){outstream << number2 << ""; }これで完全に動作します。再度、感謝します! – Bluasul

+0

代わりに、 'std :: vector'メソッドを試してください。これは、2つのファイルの数字の順序に依存しないためです。ベクトルを使わないように指示されていない限り。 –

+0

残念ながら、私はこの問題でそれを使用することはできませんが、将来それを必ず使用します。 – Bluasul

1

Barmak Shemiraniは、正しい答えを持っている:あなたは、おそらくファイルの準備ができたら、単にstd::vectorにコンテンツを読み、次のように並べ替え、instream、その後instream2

を開くことを意味しました。

弱い順序で改善されているstd:set<>は、すでに弱い順序で並べられています。つまり、別の並べ替え手順は必要ありません。

std::set<int> numbers; 
int i; 

while (instream >> i) 
    numbers.insert(i); 

while (instream2 >> i) 
    numbers.insert(i); 

for (auto n : numbers) 
    outstream << n << "\n"; 
+0

'std :: set'は重複するエントリを無視しますが、これはユーザの意図ではないことに注意してください。また、 'std :: sort'は少し高速です。その結果、2つのメソッドはほぼ同じパフォーマンスを持ちます。 –

+0

これは間違いありません。元の例には重複がなく、そのような場合には何が起こるべきかを指定していませんでした。私の答えで述べたように、あなたのことは正しいです。私はちょうどこの代替案がきれいな解決策だと思った。分かりやすい。 パフォーマンスに関しては、std :: setのバランスの取れた赤黒挿入のコストは、最悪の場合、O(_n * log(n)_)のようなものだと思います。ベクトルのappendは多かれ少なかれ線形ですが、余分なstd :: sortステップはO(_n * log(n)_)のようなものです。 – geipel