24

各行に新しい番号を含む.dataまたはファイルからベクターに読み込む必要があります。.txtfloat

私は広範囲にわたって検索し、さまざまな方法を適用しましたが、同じ結果が得られるたびに、Main.size()0のエラーが発生する"Vector Subscript out of Range"ため、ベクトルがファイルに何も読み取っていないことは明らかです。

注:ファイルはフォルダー内にあり、VSプロジェクトにも含まれています。

とにかく、これが私のコードです:

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

using namespace std;

int main() {

    vector<double> Main;
    int count;
    string lineData;
    double tmp;

    ifstream myfile ("test.data", ios::in);

    double number;  

    myfile >> count;
    for(int i = 0; i < count; i++) {
        myfile >> tmp;
        Main.push_back(tmp);
        cout << count;
    }

    cout << "Numbers:\n";
    cout << Main.size();
    for (int i=0; i=((Main.size())-1); i++) {
        cout << Main[i] << '\n';
    }

    cin.get(); 
    return 0;
}

私が得る結果は常に単純です:

Numbers:
0
4

6 に答える 6

46

あなたのループは間違っています:

for (int i=0; i=((Main.size())-1); i++) {

これを試して:

for (int i=0; i < Main.size(); i++) {

また、数値をベクトルに読み込んで stdout に書き込むより慣用的な方法は、次の行に沿ったものです。

#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>
#include <algorithm> // for std::copy

int main()
{
  std::ifstream is("numbers.txt");
  std::istream_iterator<double> start(is), end;
  std::vector<double> numbers(start, end);
  std::cout << "Read " << numbers.size() << " numbers" << std::endl;

  // print the numbers to stdout
  std::cout << "numbers read in:\n";
  std::copy(numbers.begin(), numbers.end(), 
            std::ostream_iterator<double>(std::cout, " "));
  std::cout << std::endl;

}

ifstreamただし、読み取りエラーのステータスを確認する必要があります。

于 2013-02-28T15:05:51.443 に答える
9

juanchopanzaの答えを少し拡張するだけです...

for (int i=0; i=((Main.size())-1); i++) {
    cout << Main[i] << '\n';
}

これを行います:

  1. を作成iして設定し0ます。
  2. に設定iMain.size() - 1ます。Mainは空なので、 でMain.size()あり0iに設定され-1ます。
  3. Main[-1]範囲外アクセスです。カブーム。
于 2013-02-28T15:14:18.903 に答える
8

ちょっとしたアドバイスです。書く代わりに

for (int i=0; i=((Main.size())-1); i++) {
   cout << Main[i] << '\n';
}

上記の提案に従って、次のように記述します。

for (vector<double>::iterator it=Main.begin(); it!=Main.end(); it++) {
   cout << *it << '\n';
}

イテレータを使用します。サポートがある場合は、次のようC++11に宣言できます(ただし、便利なショートカットです)iauto i=Main.begin()

これにより、意図せずに a を除外することによって引き起こされる厄介な範囲外エラーが回避されます。-1

于 2013-02-28T15:25:52.573 に答える
2

1.ループでは、値を比較するのではなく値を代入しているので、

i=((Main.size())-1) -> i=(-1) 以降 Main.size()

Main[i] は、「Vector Subscript out of Range」coz i = -1 を生成します。

2.ファイルが見つからないため、 Main.size() が0になる可能性があります。ファイル パスを指定し、出力を確認します。また、変数を初期化するとよいでしょう。

于 2013-02-28T16:34:10.670 に答える