24

我需要从每行包含一个新数字的文件.data或文件中读取到一个向量中。.txtfloat

我进行了广泛的搜索并应用了许多不同的方法,但每次我得到相同的结果时,a Main.size()of0和一个错误说"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++) {

此外,将数字读入向量并将它们写入标准输出的一种更惯用的方法是遵循以下原则:

#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()0,并且i被设置为-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而导致的讨厌的one-position-out-of-bound错误。-1

于 2013-02-28T15:25:52.573 回答
2

1.在循环中,您是在分配价值而不是比较价值,所以

i=((Main.size())-1) -> i=(-1) 因为 Main.size()

Main[i] 将产生“超出范围的向量下标”因为 i = -1。

2. 你得到 Main.size() 为 0 可能是因为它不是它找不到文件。给出文件路径并检查输出。初始化变量也很好。

于 2013-02-28T16:34:10.670 回答
-1
#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();

}
于 2018-03-29T19:42:13.483 回答
-1
  //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;
    }
}
于 2020-04-23T17:39:58.487 回答