我需要从包含每行新.data
个号码的.txt
或float
文件中读取一个向量。
我已经进行了广泛的搜索并应用了许多不同的方法,但每次我得到相同的结果,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
答案 0 :(得分:34)
您的循环错误:
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
的读取错误状态。
答案 1 :(得分:6)
只是为了扩大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。答案 2 :(得分:5)
只是一条建议。 而不是写
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
导致的令人讨厌的一位置偏离错误。
答案 3 :(得分:2)
1。 在循环中,您要分配值而不是比较值
i =((Main.size()) - 1) - &gt; i =( - 1),因为Main.size()
Main [i]将产生“向量下标超出范围”coz i = -1。
2。 你得到Main.size()为0也许因为它不能找不到文件。提供文件路径并检查输出。也可以初始化变量。
答案 4 :(得分:0)
#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();
}
答案 5 :(得分:0)
//file name must be of the form filename.yourfileExtension
std::vector<std::string> source;
bool getFileContent(std::string & fileName)
{
if (fileName.substr(fileName.find_last_of(".") + 1) =="yourfileExtension")
{
// Open the File
std::ifstream in(fileName.c_str());
// Check if object is valid
if (!in)
{
std::cerr << "Cannot open the File : " << fileName << std::endl;
return false;
}
std::string str;
// Read the next line from File untill it reaches the end.
while (std::getline(in, str))
{
// Line contains string of length > 0 then save it in vector
if (str.size() > 0)
source.push_back(str);
}
/*for (size_t i = 0; i < source.size(); i++)
{
lexer(source[i], i);
cout << source[i] << endl;
}
*/
//Close The File
in.close();
return true;
}
else
{
std::cerr << ":VIP doe\'s not support this file type" << std::endl;
std::cerr << "supported extensions is filename.yourfileExtension" << endl;
}
}