无法将行从 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.
这是基本的方法,但是真的哇,你的老师,写一个最小的向量!为此我们需要什么?
- 我们构造的东西只有正确的尺寸。
- 一种访问元素的方法。
- 正确的破坏。
所以这样的东西就足够了:
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[]
运算符取消分配数组。
我觉得我完全错过了一些东西,但是当我测试我的数组是否被 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.
这是基本的方法,但是真的哇,你的老师,写一个最小的向量!为此我们需要什么?
- 我们构造的东西只有正确的尺寸。
- 一种访问元素的方法。
- 正确的破坏。
所以这样的东西就足够了:
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[]
运算符取消分配数组。