Как читать файл в вектор в С++?

Мне нужно прочитать из файла .data или .txt, содержащего новый float номер в каждой строке в вектор.

Я искал по-разному и применял множество различных методов, но каждый раз, когда я получаю тот же результат, Main.size() of 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

Ответ 1

Ваша петля неверна:

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 для чтения.

Ответ 2

Просто, чтобы увеличить на juanchopanza немного ответьте...

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

делает следующее:

  • Создайте i и установите его на 0.
  • Установите i в Main.size() - 1. Поскольку Main пуст, Main.size() есть 0, а i устанавливается в -1.
  • Main[-1] - это доступ за пределы границ. Kaboom.

Ответ 3

Просто совет. Вместо написания

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, вы можете объявить i как auto i=Main.begin() (просто удобный ярлык)

Это позволяет избежать неприятной ошибки с одной позицией из-за границы, вызванной непреднамеренным отсутствием -1.

Ответ 4

1. В цикле вы присваиваете значение, а не сравниваете значение, поэтому

i = ((Main.size()) - 1) → я = (- 1), так как Main.size()

В главном [i] будет отображаться "векторный индекс вне диапазона" coz я = -1.

2. Вы получаете Main.size() как 0, может быть, потому, что он не может найти файл. Дайте путь к файлу и проверьте вывод. Также было бы полезно инициализировать переменные.

Ответ 5

#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();

}

Ответ 6

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

using namespace std;

int main() {
vector<double> Main;
auto number=10;                            // Number of values to read.

std::ifstream in("test.data");
copy_n(std::istream_iterator<double>(in),number , back_inserter(Main));
}