如何在动态数组中存储字符串(来自具有n行数的文件)? C ++

时间:2016-09-17 21:00:23

标签: c++ arrays dynamic access-violation

Newb here ...在数据结构上学习C ++课程。我正在创建一个程序,它从文本文件中获取一系列杂项并将它们存储在动态数组中。

//In header/ In class:

private:
/* var to keep len of list */
int len = 99; // Not sure what to set this to or if I need to even set it.
/* add appropriate data structure to store list */
string *arr = new string[len];

//In .cpp:

ListOfChores::ListOfChores(string fileName) {
ifstream file(fileName, ifstream::in);
string line;
    if (file.is_open()) //Checking if the file can be opened
    {
        while (!file.eof()) // To get all the lines.
        {
            getline(file, line); // Gets a single line
            arr[len] = line; // Store a line in the array
            len++; // Increases the array size by one
        }
        file.close(); // Closes file
    }
    else cout << "Unable to open file" << endl; // Gives error if the file can't be opened
}

但是我在数组中存储一行时遇到错误。它说“访问违规读取位置”。 main.cpp中还有另一个函数用于打印行。

1 个答案:

答案 0 :(得分:1)

您一次超出数组缓冲区,因为len已经是99.您的概念应该是capacitylength。容量是您无需重新分配即可存储的最大容量,length是实际的数据行数。

请在C ++代码中避免使用这种C风格的数组。使用vector,如果我没弄错的话已经存在了至少20年(STL)。

(你不是失败的原因,你已经在使用std::string :))

检查一下:

#include <vector>
//In header/ In class:

private:

/* add appropriate data structure to store list */
std::vector<string> arr;   // define a vector

//In .cpp:

ListOfChores::ListOfChores(string fileName) {
ifstream file(fileName, ifstream::in);
string line;
    if (file.is_open()) //Checking if the file can be opened
    {
       while (getline(file, line))
       {
           arr.push_back(line);
       }
        file.close(); // Closes file
    }
    else cout << "Unable to open file" << endl; // Gives error if the file can't be opened
}

现在arr.size()保持行数,不再限制为99行,而是最大值。程序内存容量。您仍然可以通过arr[12]arr.at(12)访问第13行,以进行边界检查访问。

迭代它的正确方法(C ++ 11),例如打印所有行:

for (auto s : arr)
{
   std::cout << s << std::endl;
}

现在,如果你真的必须使用一个数组,你可以模仿/模仿vector所做的事情(好吧,不是我确定的高效,但做的工作):

private:

 int len=0;
 int capacity=100;
 string *arr = new string[capacity];

现在在代码中,就在插入之前(未经测试,但想法是正确的):

if (len>=capacity)
{
   string *narr = new string[capacity+100];
   for (int i = 0; i < capacity; i++)
   {
        narr[i] = arr[i];
   }
   delete [] arr;
   arr = narr;
   capacity += 100; // growth
}

(你不能使用reallocmemcpy,因为你正在处理数组中的对象)