我正在研究一個代碼,該代碼讀取包含跑道「course」的文件,並且需要確定首先課程的高度和寬度。樣品過程看起來像這樣:動態分配的數組在輸出時丟失ifstream數據
xxxxXxxxxXxxxxXxxxxXxxxxXxxxxX
xxxxxx xxxxx xxx xx
xxxxx xxx xx x
xx xx x x x
X xx x x x
x xx x x
x xxxxxxxxxxxxxx x x
x xxxxxxxxxxxxxxxxxxxxx x
xFFFF x xxxxxxxxxxxxxx x
XFFFF x xxxxxxxx x
x x 1 x
xxxxxxx 2 xxx x
xxxxxx 3 x x
x x
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
現在因爲陣列需要在編譯時間常數的值,並且我不能提供的是,我試圖陣列動態分配給存儲器一次的高度和寬度值被檢索。總之,我的代碼看起來就像這樣:
#include <iostream>
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
struct Level {
int HEIGHT;
int WIDTH;
};
vector<Level> getRowCol(istream& fin) {
vector<Level> level;
fin.seekg(0, fin.end);
int fileSize = fin.tellg();
fin.seekg(0, fin.beg);
string s;
if (getline(fin, s)) {
Level l;
l.WIDTH = s.size();
l.HEIGHT = fileSize/(l.WIDTH + 1);
level.push_back(l);
}
return level;
}
void readCourse(int& cols, int& rows, istream& fin) {
char** level = new char*[rows];
for (int i = 0; i < cols; i++) {
level[i] = new char[cols];
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
level[i][j] = 0;
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
fin.get(level[i][j]);
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << level[i][j];
}
}
}
int main(int argc, char** argv) {
vector<Level> course;
ifstream fin(argv[1]);
course = getRowCol(fin);
cout << course[0].WIDTH << " columns" << endl;
cout << course[0].HEIGHT << " rows" << endl;
readCourse(course[0].WIDTH, course[0].HEIGHT, fin);
return 0;
}
傳遞時通過命令行的文件中的這段代碼的輸出如下:
31 columns
14 rows
xxxxxx xxxxx xxx xx
xxxxx xxx xx x
xx xx x x x
X xx x x x
x xx x x
x xxxxxxxxxxxxxx x x
x xxxxxxxxxxxxxxxxxxxxx x
xFFFF x xxxxxxxxxxxxxx x
XFFFF x xxxxxxxx x
x x 1 x
xxxxxxx 2 xxx x
xxxxxx 3 x x
x x
Xxxxxxxxxxxxxxxxxx
有現在似乎是空白。如果在編譯時間之前聲明const int
值,則不會出現這些間隔。然而,我不能想到另一種方法來使用未知值構建數組,直到腳本運行時沒有使用動態分配。
有沒有其他的或更好的方法來實現這一目標?
爲什麼不堅持使用'std :: vector'而不是在'readCourse'函數中引入巨大的內存泄漏?一個'std :: vector>級別(行,std :: vector (cols));'本來是使用vector的方式。 –
PaulMcKenzie
@PaulMcKenzie嗯。我不得不進一步看看。在第一次測試中,根據您的推薦更改動態分配會產生相同的結果。我對媒介不太熟悉,你能否進一步闡述糾正? –
我發佈的代碼糾正了您原來的一個大錯誤,因爲沒有內存泄漏。您已經在'getRowCol'函數中使用'std :: vector',並且所有的聲明都聲明瞭一個矢量矢量,因此本質上是一個動態二維數組。 – PaulMcKenzie