如何在C++中将文件读入vector?

Org*_*gmo 18 c++ file-io vector

我需要从每行包含一个新数字的文件.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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的结果总是简单:

Numbers:
0
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 36

你的循环错了:

for (int i=0; i=((Main.size())-1); i++) {
Run Code Online (Sandbox Code Playgroud)

试试这个:

for (int i=0; i < Main.size(); i++) {
Run Code Online (Sandbox Code Playgroud)

此外,将数字读入矢量并将其写入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;

}
Run Code Online (Sandbox Code Playgroud)

虽然您应该检查ifstream读取错误的状态.

  • 就这样吧。隐藏的分配错误。谢谢,C! (2认同)

Mik*_*one 6

只是为了扩大juanchopanza的答案...

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

做这个:

  1. 创建i并设置为0.
  2. 设置iMain.size() - 1.因为Main是空的,Main.size()0,并且i被设置为-1.
  3. Main[-1]是一个越界访问.KABOOM.


pho*_*gon 5

只是一个建议。而不是写作

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

如上所述,请写:

for (vector<double>::iterator it=Main.begin(); it!=Main.end(); it++) {
   cout << *it << '\n';
}
Run Code Online (Sandbox Code Playgroud)

使用迭代器。如果有C++11支持,您可以声明iauto i=Main.begin()(不过只是方便的快捷方式)

这避免了由于无意中遗漏而导致的讨厌的“ 一出界”错误-1