Falls es ein super wichtiger Grund das zu tun, mit einem Array, dann std::new verwenden, wie folgt aus:
#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;
}
Ausgang:
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
String
String2
String3
jedoch Sie sind in c++ und Sie verwenden keine std::vector dafür?
Sehen Sie, wie einfach es ist mit das heißt:
#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;
}
Ausgang:
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
String
String2
String3
Edit:
Wir haben einen Zeiger auf zu übergeben, was wir ändern wollen (das heißt, die string*
), sonst werden die Änderungen, die wir anwenden, nicht stattfinden.Testen Sie es selbst, übergeben Sie eine string*
als Parameter anstelle von string**
, ändern Sie den Körper der Funktion und sie, was passiert.
Um die Idee zu bekommen, stellen Sie sich vor, wir wollen auf den Zeiger schreiben, die neue Adresse, die new
gab uns und hält den Speicher angefordert. Wir schreiben diese Adresse in die Funktion, aber wenn die Funktion beendet wird, wollen wir, dass die Änderungen persistent sind. Sehen Sie meine Functions in C als ein Beispiel.
Können Sie eine 'std :: vector' anstelle eines Arrays verwenden verwenden? –
StaticBeagle
Ich möchte ehrlich zu dir sein ... Es ist wirklich cool jemandem zu helfen, aber du solltest immer daran denken, dass wir irgendwo anfangen müssen. Das bedeutet, dass Sie beginnen müssen, bevor Sie die Ziellinie überqueren können. – tistCoder