3

ファイルから数値のリストを読み取り、それらを配列に読み取ってから配列の内容を並べ替えることで並べ替えようとしています。しかし、私は得ています

error:incompatible types in assignment of 'std::basic_ostream<char, std::char_traits<char> >' to 'int [1]' 

私はプログラミングを始めたばかりで、C++ を使用するのはこれが初めてです。数値のリストを配列に書き込んで並べ替える方法を誰か教えてもらえますか? ここに私が持っているものがあります:

#include <fstream>
#include <iostream>
#include <iomanip>
#define ANYSIZE_ARRAY 1
using std::cout;
using std::endl;


int main()
{
  const char* filename = "test.txt";
  std::ifstream inputFile(filename);
  int numbers[ANYSIZE_ARRAY];
  int i, key;

  // Make sure the file exists
  if(!inputFile)
  {
    cout << endl << "The File is corrupt or does not exist. " << filename;
    return 1;
  }

  long n = 0;
  while(!inputFile.eof())
  {
    inputFile >> n;
    numbers = cout << std::setw(10) << n;
  }

  for(int j=1;j<5;j++)
    {
        i=j-1;
        key=numbers[j];
        while(i>=0 && numbers[i]>key)
        {
                    numbers[i+1]=numbers[i];
                    i--;
        }
        numbers[i+1]=key;
    }

    //Display sorted array
    cout<<endl<<"Sorted Array\t";
     for(i=0;i<5;i++)
       cout<<numbers[i]<<"\t";
    cout<<endl;
}
4

3 に答える 3

6

エラーの原因となっている行は次のとおりです。

numbers = cout << std::setw(10) << n;

ここで何をしようとしているのかよくわかりません。印刷したいだけのようです。その場合numbers =は必要ありません。

すべてのデータを読み取るためのループの構造にも問題があります。行:while (!inputFile.eof())慣用的な C++ ではなく、期待どおりに動作しません。その問題に関する議論については、こちらを参照してください(およびこちら)。

参考までに、次を使用することで、より少ない作業でこれを非常に簡単に行うことができますstd::sort

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

int main() {
  std::ifstream in("test.txt");
  // Skip checking it

  std::vector<int> numbers;

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

  // Sort the vector:
  std::sort(numbers.begin(), numbers.end());

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

このプログラムはまたstd::vector、配列の代わりに を使用して、「配列の大きさはどのくらいですか?」を抽象化します。問題(あなたの例には問題がある可能性があるように見えました)。

于 2012-05-20T21:21:08.740 に答える
3

まず、アウトストリーム変数を int に割り当てないでください。次に、n は long 型で、numbers は整数配列です。型安全性がありません。3 番目に、配列サイズを事前に割り当てる必要があります。次に、STL 関数で sort() を直接使用して並べ替えを行うことができます。

次のコードを試してください。

#include <fstream>
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;

#define ANYSIZE_ARRAY 5

int main()
{
const char* filename = "test.txt";
std::ifstream inputFile(filename);
int numbers[ANYSIZE_ARRAY];
int i, key;

// Make sure the file exists
if(!inputFile)
{
    cout << endl << "The File is corrupt or does not exist. " << filename;
    return 1;
}

int n = 0;
i = 0;
while(!inputFile.eof())
{
    inputFile >> n;
    cout << std::setw(10) << n;
    numbers[i++] = n;
}

sort(numbers, numbers + ANYSIZE_ARRAY);


//Display sorted array
cout<<endl<<"Sorted Array\t";
for(i=0; i<ANYSIZE_ARRAY; i++)
    cout<<numbers[i]<<"\t";

cout<<endl;
}
于 2012-05-20T21:25:02.663 に答える
3

プログラムを機能させるために必要なことは次のとおりです。

  • 5ANYSIZE_ARRAYに変更
  • 数字を読んだところを、次のように置き換えますwhile

    long n = 0;
    i=0;
    while(!inputFile.eof())
    {
            inputFile >> n;
            cout << std::setw(10) << n;
            numbers[i]=n;
            i++;
    }
    

このようにして、5 つの数値を保持できる配列を作成し、その配列に数値を読み取ります。ソート アルゴリズムで同じ数字を使用していることがわかったため、5 を使用しました。あなたのプログラムは 5 つの数字しか扱えないので、これは悪いことです。

可変量の数値を扱う必要がある場合は、 a を使用しstd::vector<long>て数値を格納できます。ベクトルを作成し、 を使用push_back()してそれに数値を追加できます。ベクトルは自動的にサイズ変更され、入力した数だけ保持されます。5次に、コード内の s をベクターのsize()メソッドに置き換えることができます。

この行は意味がないため、元のエラーが発生していました。

numbers = cout << std::setw(10) << n;

C++ では、数値を stdout ストリーム (この場合はコンソール、画面) に出力しようとしているかのようにその行が表示され、そのストリームが "numbers" 配列に割り当てられます。出力ストリームを整数配列に割り当てることはできません (したがって、エラーは ostream から int[1] に変換できません)。

于 2012-05-20T21:14:33.120 に答える