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

时间:2013-02-28 15:03:17

标签: c++ vector file-io

我需要从包含每行新.data个号码的.txtfloat文件中读取一个向量。

我已经进行了广泛的搜索并应用了许多不同的方法,但每次我得到相同的结果,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

6 个答案:

答案 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';
}

这样做:

  1. 创建i并将其设置为0
  2. i设为Main.size() - 1。由于Main为空,Main.size()0i设为-1
  3. 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;
    }
}