web-dev-qa-db-ja.com

C ++でファイルをベクターに読み込む方法は?

各行の新しいfloat番号を含む_.data_または_.txt_ファイルからベクトルに読み込む必要があります。

私はこれまで幅広く検索し、多くの異なる方法を適用しましたが、毎回_0_のMain.size()と_"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
_
18
Orgmo

ループが間違っています:

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

これを試して:

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

また、数値をベクトルに読み込んで標準出力に書き込むより慣用的な方法は、次のようなものです。

#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のステータスで読み取りエラーを確認する必要があります。

35
juanchopanza

ジュアンチョパンザの答えを少し拡大するために...

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

これを行います:

  1. iを作成し、_0_に設定します。
  2. iMain.size() - 1に設定します。 Mainは空なので、Main.size()は_0_であり、iは_-1_に設定されます。
  3. _Main[-1]_は範囲外アクセスです。カボム。
6
Mike DeSimone

ほんの一言。書く代わりに

_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()として宣言できます(ただし、便利なショートカットです)

これにより、_-1_を意図せずに除外することによって引き起こされる厄介なone-position-out-of-boundエラーが回避されます。

5
phoeagon

1.ループでは、値を比較するのではなく、値を割り当てています。

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

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

2. Main.size()が0になるのは、ファイルが見つからないためかもしれません。ファイルパスを指定し、出力を確認します。また、変数を初期化することをお勧めします。

2
Shriraj
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main()
{
fstream dataFile;
string name , Word , new_Word;
vector<string> test;
char fileName[80];
cout<<"Please enter the file name : ";
cin >> fileName;
dataFile.open(fileName);
if(dataFile.fail())
{
     cout<<"File can not open.\n";
     return 0;
}
cout<<"File opened.\n";
cout<<"Please enter the Word : ";
cin>>Word;
cout<<"Please enter the new Word : ";
cin >> new_Word;
while (!dataFile.fail() && !dataFile.eof())
{
      dataFile >> name;
      test.Push_back(name);
}
dataFile.close();

}
0
muhammadOsama