在情況下,存在這樣做與數組,然後使用std::new,這樣的超級重要的原因:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
int reading(string** str_array, int& size, string filename) {
ifstream infile(filename.c_str());
if(!infile) {
cerr << "Unable to access file!\n";
return -1;
}
int n = 0;
infile >> size;
try{
*str_array = new string[size];
string str;
for (; n < size && infile; ++n) {
infile >> str;
(*str_array)[n] = str;
}
if (n != size)
cerr << "ERROR, read less than " << size << " strings!!\n\n";
} catch(bad_alloc& exc) {
return -2;
}
return 0;
}
int main() {
string* str_array = NULL;
int size;
if(reading(&str_array, size, "test.txt")) {
cerr << "Din't read file, exiting...\n";
return -1;
}
for(int i = 0; i < size; ++i)
cout << str_array[i] << endl;
delete [] str_array; // DO NOT FORGET TO FREE YOUR MEMORY
str_array = NULL;
return 0;
}
輸出:
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
String
String2
String3
然而,你在c++,你沒有使用這個std::vector?
顯得多麼簡單,它是與:
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int reading(vector<string>& v, string filename) {
ifstream infile(filename.c_str());
if(!infile) {
cerr << "Unable to access file!\n";
return -1;
}
int N = -1, n = 0;
infile >> N;
string str;
for (; n < N && infile; ++n) {
infile >> str;
v.push_back(str);
}
if (n != N)
cerr << "ERROR, read less than " << N << " strings!!\n\n";
return 0;
}
int main() {
vector<string> v;
if(reading(v, "test.txt")) {
cerr << "Din't read file, exiting...\n";
return -1;
}
for(size_t i = 0; i < v.size(); ++i)
cout << v[i] << "\n";
return 0;
}
輸出:
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
String
String2
String3
編輯:
我們有一個指針傳遞給我們要修改的內容(也就是string*
),否則我們所應用的更改將不會發生。自己測試一下,通過string*
作爲參數而不是string**
,修改函數的主體,她會發生什麼。
想象一下,想象一下,我們想要寫入指針,新地址,其中new
給了我們並持有請求的內存。我們在函數內寫入該地址,但是當函數終止時,我們希望這些更改是持久的。以我的Functions in C爲例。
你會用'的std ::矢量',而不是一個數組? –
StaticBeagle
我想對你說實話......幫助別人真的很酷,但你應該永遠考慮到我們必須從某個地方開始。這意味着你必須開始,然後才能通過終點線 – tistCoder