Мне нужно прочитать из файла .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));
}