无法将行从 txt 文件传递​​到数组

Having trouble passing lines from txt file to array

我觉得我完全错过了一些东西,但是当我测试我的数组是否被 txt 文件中的值填充时,我的编译器完全没有显示任何内容。

void orderID(){
  ifstream result;

  int flag;
  int loop = 0;
  string temp;

  string line;
  string myArray[flag];

  result.open("resultat.txt");
  while(getline(result, line)){
    flag++; //number of lines in file
  }
  result.close();

  result.open("resultat.txt");
  while(getline(result, line)){
    myArray[loop] = line;
    loop++;
    cout<< myArray[1];
  }
  result.close();
}

应该post txt文件我正在测试。它应该适用于任何文件。

21 para 21 first
23 dyta 23 second
11 katert 11 fourth
12 pest 12 fifth
13 fundit 13 last
14 jojo 14 nono

有人知道我在这里缺少什么吗?顺便说一句,请不要建议矢量,因为我不能在这种情况下使用它们。是的,我正在从 int main 调用函数。

您需要使用正确的大小初始化 myArray,这意味着在您计算标志之后,而不是在它未定义时

void orderID(){
  ifstream result;

  int flag = 0;
  int loop = 0;
  string temp;

  string line;

  result.open("resultat.txt");
  while(getline(result, line)){
    flag++; //number of lines in file
  }
  result.close();

  string myArray[flag];

  result.open("resultat.txt");
  while(getline(result, line)){
    myArray[loop] = line;
    loop++;
    cout<< myArray[1];
  }
  result.close();
}

这里有点误会:

int flag; // uninitialised, this value could be anything
...
string myArray[flag]; // 1. you haven't set flag, how can we know how big this is
                      // 2. VLA are non-standard c++, you can't do this so easily

既然你说你不能使用一个有点无赖的std::vector,你将需要自己处理内存。这意味着使用 new[]delete[]。像这样:

int flag = 0
// Use your loop to find out the size of the vector
string* myArray = new string[flag]
// use myArray the same way (aka, get things with myArray[myIndex])
// make sure you check for out of bounds operations
delete[] myArray // This is super important, when you use new, you must use delete. 

这是基本的方法,但是真的哇,你的老师,写一个最小的向量!为此我们需要什么?

  1. 我们构造的东西只有正确的尺寸。
  2. 一种访问元素的方法。
  3. 正确的破坏。

所以这样的东西就足够了:

class MyVector {
  public:
    MyVector(unsigned size) { // Constructor for a specific size
        array_ = new string[size];
    }

    string& operator[](unsigned index) { // A way to access the elements
        return array_[index];
    }

    ~MyVector() { // A way to destroy it
        delete[] array_;
    }

    // You should really delete copy constructor and others (rule of 5) but that
    // is a little advanced for this. 

  private:
    string* array_;

};

然后你就可以在你的代码中很好地使用它了:

int flag = 0
// ...
MyVector myArray(flag);
// ...
    myArray[someIndex] = someThing;
//...
//... No need to delete, that is handled by the class.       

它是安全的(嗯,更安全),有点可重复使用,而且封装得很好。

您似乎在尝试使用变量作为数组长度来初始化 myArray,这在 C++ 中是不允许的。

由于您不能在此代码中使用向量,因此您需要使用 new 运算符将 space 分配给数组。

所以首先,您需要将 flag 初始化为 0。然后,一旦您计算了文件中的行数,同样创建 myArray

string *myArray = new string[flag];

这一行的作用是在堆上为 myArray 分配大小为 flags 的内存。

因此您的代码应如下所示:

flag = 0;
while(getline(result, line)){
    flag++;
}
string *myArray = new string[flag];
//...
delete[] myArray;

完成数组后,您可以使用 delete[] 运算符取消分配数组。