1

Eine Textdatei sieht wie folgt aus:Erstellen von Array nach Variable in andere Funktion bekommen

3 
String 
String2 
String3 

ich eine Funktion erstellen, müssen alle Strings aus Textdatei zu lesen, um sie zu Array speichern und dann in Hauptfunktion anzuzeigen . Zum Beispiel

void reading(int & count, string strings[]) { 
ifstream fd "text.txt"; 
fd >> count; 
for (int i=0; i<count; i++) 
fd >> strings[i]; 
fd.close(); 

Und Hauptfunktion:

int main() { 
int count=0; 
string strings[100]; 
reading(count, strings); 
for (int i=0; i<count; i++) 
cout << strings[i] << endl; 

Die Anzahl der Strings in der ersten Zeile der Textdatei geschrieben wird. Wie kann ich ein Array mit genau dieser Nummer erstellen? Ich brauche es, um es in Haupt-/anderen Funktionen zugreifen zu können. (Zum Beispiel Funktion zum Schreiben in eine andere Textdatei).

+1

Können Sie eine 'std :: vector ' anstelle eines Arrays verwenden verwenden? – StaticBeagle

+0

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

Antwort

4

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 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.

+0

Dies ist wahrscheinlich eine Hausaufgabe, die _IF_ es ist, gibt es Einschränkungen für die Verwendung von Dingen wie in der Klasse. – M4rc

+0

@ M4rc Annahmen über dies ist etwas, das sollte ein Teil der Logik sein, die Person, die Antworten zu folgen hat, ich meine, was zum Teufel ?! Wenn es Hausaufgaben sind, dann sag es. Aber OK, ich werde auch eine andere Version zur Verfügung stellen ... – gsamaras

+0

Ich stimme zu. Idealerweise würden die Leute diese Dinge entsprechend markieren. Aber seit wann haben wir in einer idealen Welt gelebt? Der einzige Grund, warum ich davon ausgehe, ist, dass ich vor vielen Monden ein ähnliches Programm hatte. Aber andererseits gibt es Menschen in SO, die Leute fragen, wie man eine gesamte CLI-Schnittstelle programmiert. – M4rc

2

Ordnen einer Anordnung auf dem Haufen, wie folgt aus:

std::string* stringArr = new std::string[(place amout of strings here)]; 

und nicht vergessen es am Ende der Haupt()

delete stringArr[]; 

Variables/Arrays auf der zu lösch Heap sind dynamisch, so dass die Größe nicht behoben werden muss!

std::string* → Dies ist ein Zeiger, der auf die Adresse des Anfangs dieses Arrays in Ihrem Speicher zeigt. (Einfach Ihren Computer zu informieren, wo es ist)

stringArr → den Namen des Arrays

new → ordnet neue Speicher

std::string[size] → sagt, wie viel zuzuteilen

ich gesehen habe einige Antworten, die über "Vektoren" sprachen. Wenn Sie sie benutzen möchten, können Sie diese Seite für weitere Informationen sehen! → Vector documentation

+0

Sie sollten stattdessen einen Vektor verwenden, da er sich um die Verwaltung des Speichers kümmert. – Kariem

+1

@Kariem Es wäre aber bevor du einen Vektor kennenlernen solltest solltest du die Grundlagen lernen! Weil ein Vektor Speicher auf dem Heap verwendet – tistCoder

+1

+1 - Das Verstehen der Grundwerte dahinter, wie Vektoren, Karten, etc. funktionieren, ist weit relevanter als einfach der Mob-Mentalität zu folgen, einen STL-Container auf alles zu werfen. – M4rc

0

einen Vektor

#include <vector> 
#include<fstream> 
#include <iostream> 
using namespace std; 
void reading(int & count, vector<string> * strings) { 
    ifstream fd("text.txt"); 
    fd >> count; 
    string T; 
    for (int i=0; i<count; i++) 
    { 
     fd >> T; 
     strings->push_back(T); 
    } 
    fd.close(); 
} 

int main() { 
    int count=0; 
    vector<string> strings; 
    reading(count, &strings); 
    for (int i=0; i<count; i++) 
     cout << strings[i] << endl; 
}