0

ユーザーが選択した 2 つのファイルに基づいてファイルを並べ替えようとしています。文字列変数を使用してに渡していますが、ファイルが壊れているか存在しないというステートメントにinstream()進み続けます。ifファイル名をハードコーディングすると、完全に正常に機能するため、存在することはわかっています。私はそれが単純なものだと確信していますが、私はそれを理解することができません。私はc ++に非常に慣れていないので、理解して学ぶことができるように、あなたの答えを徹底的にしてください。前もって感謝します!

#include <iterator>
#include <algorithm>
#include <vector>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

std::string file = "";
std::ofstream out("outputfile.txt");
std::vector<int> numbers;
std::string sortType = "";

void sort(std::vector<int>);
void MergeSort(vector<int> &numbers);


int main()
{
  std::cout << "Which type of sort would you like to perform(sort or mergesort)?\n";
  std::cin >> sortType;

  std::cout << "Which file would you like to sort?\n";
  std::cin >> file;

  std::ifstream in(file);
  //Check if file exists
  if(!in)
  {
    std::cout << std::endl << "The File is corrupt or does not exist! ";
    return 1;
  }

  // Read all the ints from in:
  std::copy(std::istream_iterator<int>(in), std::istream_iterator<int>(),
            std::back_inserter(numbers));

  //check if the file has values
  if(numbers.empty())
  {
      std::cout << std::endl << "The file provided is empty!";
      return 1;
  } else
  {
      if(sortType == "sort")
      {
          sort(numbers);
      }else
      {
          MergeSort(numbers);
      }

      // Print the vector with tab separators:
      std::copy(numbers.begin(), numbers.end(),
                std::ostream_iterator<int>(std::cout, "\t"));
      std::cout << std::endl;

        // Write the vector to a text file
      std::copy(numbers.begin(), numbers.end(),
                std::ostream_iterator<int>(out, "\t"));
        std::cout << std::endl;
  }
  return 0;
}

void sort(std::vector<int>)
{
  // Sort the vector:
  std::sort(numbers.begin(), numbers.end());
  std::unique(numbers.begin(), numbers.end());

  return;
}

vector<int> Merge(vector<int> &left, vector<int> &right)
{
    std::vector<int> result;

    while (left.size() > 0 && right.size() > 0)
    {
        if (left[0] <= right[0])
        {
            result.push_back(left[0]);
            left.erase(left.begin());
        } else
        {
            result.push_back(right[0]);
            right.erase(right.begin());
        }
    }

    if (left.size() > 0)
    {
        result.insert(result.end(), left.begin(), left.end());
    } else
    {
        result.insert(result.end(), right.begin(), right.end());
    }
    return result;
}

void MergeSort(vector<int> &numbers)
{
    if (numbers.size() <= 1)
    {
        return;
    }

    // split vector into two peices
    vector<int> left, right;
    unsigned int Middle = numbers.size() / 2;

    for (unsigned int i = 0; i < Middle; i++)
    {
        left.push_back(numbers[i]);
    }

    for (unsigned int i = Middle; i < numbers.size(); i++) {
        right.push_back(numbers[i]);
    }

    MergeSort(left);
    MergeSort(right);
    numbers = Merge(left, right);
    return;
}
4

2 に答える 2

1

名前で指定されたファイルをまだチェックしています""。ラインを入れると

std::ifstream in(file);

これは、名前 "" (fileその時点での の値) で指定されたファイルへのストリームを開きます。後で、あなたは言う

if (!in)

使用するファイルを実際に更新することなく。

これを試して:

std::ifstream in; //no file specified

//the following comes before if (!in)
in.open (file);

これにより、ストリームが の入力値に開かれますfile

これを行うより良い方法は、2 行目の代わりにファイルを宣言して開き、最初の行を失うことです。

std::ifstream in (file); //after they input the filename

理由がなければ、グローバル変数を使用することは一般的に悪い考えです。それらを関数で渡すか、クラスにすべて含めることをお勧めします。

また、あなたが宣言したことに気付きましたがusing namespace std;、まだstd::vectoretc を使用しています。私は間違いなく後者を選択し、前者を削除します。ただし、解決策が欠けているいくつかのものに解決策を追加するように注意してください。

于 2012-05-28T03:47:00.310 に答える
0

open()ステータスを確認する前に、ファイルにアクセスする必要があります。

于 2012-05-28T03:45:11.157 に答える