c ++ wie man eine Datei in ein Array einliest


Antwort 1:

C ++ verwendet C-Standard-E / A für den Zugriff auf Dateien. C-Code funktioniert also einwandfrei.

C ++ hat einige nette iostream-Objekte, die auf diese Weise eine Menge netter Sachen machen.

Es ist hilfreich, das Format der Datei zu kennen. Lesen Sie durch Kommas getrennte Zahlen, durch Leerzeichen getrennte Zahlen oder eine pro Zeile?

Sie haben Recht, dass es sich nicht um Zahlen handelt, sondern um numerischen Text. Sie müssen den Text nach dem Lesen in Zahlen umwandeln. Wenn Sie nicht wissen, welche Art von Zahlen Sie verwenden, verwenden Sie double, um alle Wetten abzudecken.

Michael Bauers Antwort ist gut, aber es gibt keine Erklärung.

Datei öffnen Text lesen Text in Nummer umwandeln zum Container hinzufügen. Datei schließen

meine Meinung:

Erstellen Sie einen Operator, um Zahlen aus einer Datei in einen Vektor einzugeben.

Zahlenvektor erstellen Datei öffnen Operator anwenden, um Vektor zu füllen Datei schließen Vektor verwenden

// Erstelle einen Operator >> um mit Vektor und Istream zu arbeiten std :: istream & operator >> (std :: istream & in, std :: vector & v){ doppeltes d; while (in >> d) // ifstream führt Text-> Doppelkonvertierung durchv.push_back (d); // zum Vektor hinzufügen zurückkehren in; // gibt den Istream selbst zurück}} // mache einen Vektor, um Doppel zu haltenstd :: vector mynumbers;std :: ifstream inputFile {"file.txt"}; // {} ist die Syntax der 'Initialisierungsliste' while (inputFile)inputFile >> mynumbers; // alle Zahlen eingeben bis fertiginputFile.close (); // schließe die Datei// Jetzt wird der Vektor geladen, die Datei wird geschlossen - fertig.

Die Leseschleife befindet sich in der Operator >> -Funktion, daher ist die Syntax knapp, aber gut lesbar. Alles geht schief (Datei nicht gefunden, keine Daten ..) und der ifstream bereinigt sich selbst und generiert eine Fehlerausnahme, die Sie abfangen oder das Programm sterben lassen können.


Antwort 2:

Frage: Wie kann ich Zahlen in einer Textdatei in ein Array in C ++ einlesen?

Wow 3 Beantworte Anfragen von 3 verschiedenen Personen zu derselben Frage. Seltsam! Es scheint fast so, als hätte jemand gegoogelt, um die Antwort zu ermitteln, anstatt auch Quora zu fragen. Ich muss nicht googeln - ich kann den Code aus dem Speicher schreiben und meine Gedanken:

#einschließen #einschließen #einschließen Verwenden des Namespace std;int main (int argc, char ** argv){ ifstream in ("file.txt", ifstream :: in);Vektor lstNumbers; while ((! in.eof ()) && in) { int iNumber = 0; in >> iNumber; lstNumbers.push_back (iNumber); }} in.close (); // Was möchtest du mit diesen Zahlen machen ???}}

Ok, ich habe gelogen - ich musste die C ++ - Referenz für die Vektorklasse googeln, weil ich sie ehrlich gesagt nie benutze. Ich arbeite mit dem QT-Framework, das seine eigenen Klassen für alle Datenstrukturen (Liste, Karte, Menge usw.) hat. Außerdem arbeite ich normalerweise nicht mit Datei-E / A - ich arbeite hauptsächlich professionell in Java und selbst dort arbeite ich nicht mit Dateien außer JSON- und XML-Dateien, und für diese gibt es Bibliotheken, die Dinge für den Programmierer abstrahieren Man muss sich also nicht darum kümmern, Teile aus der Datei zu öffnen, zu schließen oder zu lesen. Aber das sollte den Trick für dich tun, glaube ich.

Ich habe dies nicht getestet - nur um es klar zu machen - Eine Änderung, die ich vornehmen könnte, besteht darin, den Dateicode in einen Try / Catch-Block zu packen, aber da C ++ Ausnahmen wie Java weniger anal ist, habe ich dies nicht getan. Der Versuch / Fang würde verhindern, dass lästige Fehler auftreten, selbst wenn die Datei geöffnet oder geschlossen wird - sozusagen mit dem Fehler.


Antwort 3:

Etwas wie das.

Im Allgemeinen mag ich es nicht, Ints direkt aus einer Datei zu lesen. Ich neige dazu, Zeile für Zeile zu lesen und dann die Zeile zu analysieren. Ich gebe zu, ich bin mir nie 100% sicher, wie ich Zahlen direkt lese, z. B. was passiert, wenn dazwischen Dinge liegen, die keine Zahlen sind.

Wenn dies kein Projekt ist, das Arrays erfordert, würde ich einen Vektor verwenden. Die Größe von Arrays wird nicht geändert, und das Schreiben von Programmen mit festen Puffern ist ein Fehler. Ich kann dies beweisen, indem ich Ihnen erzähle, wie oft ich mich verbrannt habe, weil ich dachte, ich hätte die maximale Größe groß genug gemacht (das werde ich nicht, aber es gab Zeiten .)

#einschließen #einschließen #einschließen #einschließen Verwenden des Namespace std;int main () { ifstream myfile ("d: \\ numbers.txt"); if (myfile.is_open ()) { int arrSize = 0;Array arr; // Idealerweise wäre dies ein Vektor, aber Sie sagten Array während (wahr) { int x; myfile >> x; if (myfile.eof ()) brechen; arr [arrSize ++] = x; }} für (int i = 0; i cout << arr [i] << ""; cout << endl; // Ich hätte die Datei hier schließen sollen, aber als das Programm endete, war ich faul} sonst { cout << "Datei kann nicht geöffnet werden"; }} return 0;}}

Antwort 4:

Wenn Sie sicher sind, dass die Datei nur Zahlen enthält, die Sie lesen möchten, und Sie vernünftig genug sind, „Array“ als abstraktes Konzept zu behandeln, anstatt sich speziell auf das Array-Ding zu beziehen, das C ++ von C geerbt hat, kann es Es ist ziemlich vernünftig, einen Vektor zu initialisieren (oder Vektor usw.) aus einer Datei wie dieser:

std :: ifstream input ("numbers.txt");std :: vector Zahlen {std :: istream_iterator (Eingabe), {}};

(für "T" = welcher Typ auch immer Sie lesen möchten - int, double, float usw.)

Wenn Ihre Datei möglicherweise zusätzlichen "Junk" zwischen den Zahlen enthält, können Sie im Allgemeinen immer noch dasselbe tun, wenn Sie möchten. Ein istream_iterator ist im Grunde ein Adapter, der den Operator >> verwendet, um Elemente aus dem Stream zu lesen. Das wiederum ignoriert Leerzeichen, also so etwas wie `1 2` wird als 1 gefolgt von 2 gelesen.

Aber hier ist einer der Orte, an denen iostreams eigentlich ziemlich anständig gestaltet ist: Der iostream bestimmt (selbst) nicht, was Leerzeichen sind. Stattdessen wird dies an das Gebietsschema des Streams delegiert.

Wenn wir zusätzlichen Müll im Stream ignorieren möchten (z. B. alles, was keine Ziffer ist), können wir ein Gebietsschema definieren, das besagt, dass alles andere Leerzeichen sind, und dann einfach unsere Zahlen aus dem Stream lesen.

struct digits_only: std :: ctype {digits_only (): std :: ctype (get_table ()) {} statisch std :: ctype_base :: mask const * get_table () { // Erstelle zuerst eine Tabelle, die besagt, dass alles Leerzeichen ist: statischer std :: vector rc (std :: ctype :: table_size, std :: ctype_base :: space); // dann setze die Ziffern als tatsächlich Ziffern: if (rc ['0'] == std :: ctype_base :: space) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // Die Tabelle zurückgeben, um die Zeichen entsprechend zu klassifizieren: return & rc [0]; }}};

Anschließend weisen wir den Stream an, dieses Gebietsschema zu verwenden, und lesen Daten aus dem Stream:

int main () { std :: istringstream input (R "(11 Junk 1,00 mehr Junk 16,0 noch mehr Junk 1,999! @ # $$% ^ $% & * endlich fertig)"); input.imbue (std :: locale (std :: locale (), nur neue Ziffern));std :: vector Zahlen {std :: istream_iterator (Eingabe), {}};}}

Und da das Gebietsschema sagt, dass alles außer einer Ziffer ein Leerzeichen ist, werden alle zusätzlichen „Dinge“ zwischen den Zahlen als Leerzeichen behandelt (dh stillschweigend ignoriert), sodass wir nur die Zahlen erhalten.


Antwort 5:

Sie können die Zahlen in einer txt-Datei mit dem folgenden Code lesen.

#einschließen

#einschließen

#einschließen

void main ()

{char ch; int a; int arr [[30]; int i = 0;

ifstream f1 ("abc.txt");

while (! f1.eof ())

{

fi >> ch;

a = static_cast CH;

arr [i] = a;

}}

f1.close ();

getch ();

}}

Dieses Programm liest eine Textdatei, von der angenommen wird, dass sie bereits vor diesem Programm erstellt wurde, da die Datei im txt-Format vorliegt, sodass wir eine Zahl für die char-Variable speichern, da die char-typisierte Variable Zeichen speichern kann, und dann die static_cast () -Funktion verwenden wandeln Sie den Zeichenwert in einen ganzzahligen Wert um und setzen Sie ihn in int a. Anschließend verwenden wir eine Variable, um den Wert einzeln im Array zu speichern.

Danke …..


Antwort 6:

Ich werde den Code nicht schreiben, aber ich werde das Beste erklären, was ich kann. Wenn Sie den ifstream-Header verwenden, möchten Sie eine Schleife ausführen, bis der EOF (Dateiende) auf Ihrem ifstream-Objekt gefunden wird. Lesen Sie während der Schleife jede Textzeile in eine Zeichenfolgenvariable. Teilen Sie jede Zeichenfolge in Teile, die durch Leerzeichen getrennt sind. Testen Sie für jedes Teil (Token), ob es in eine Ganzzahl konvertiert werden kann. Wenn dies möglich ist, fügen Sie es Ihrer Liste hinzu, andernfalls fahren Sie mit dem nächsten fort. Sie haben also im Wesentlichen eine äußere Schleife, die Textzeilen erhält, und eine innere Schleife, die jede Textzeile in Teile zerlegt und versucht, daraus eine Zahl zu erstellen.

Sobald Sie die letzte Iteration der inneren und äußeren Schleife beendet haben, haben Sie eine Liste, mit der Sie alles tun können.


Antwort 7:

Angenommen, Sie haben eine Datei, nämlich input.txt. Sie können die folgenden Codeausschnitte verwenden, um Ganzzahlen aus der Datei zu lesen. Ich hoffe es hilft :-)

#einschließen Verwenden des Namespace std;const int sz = 1001; // sz auf maximale Größe des Arrays setzenint array [sz];int main (){ freopen ("input.txt", "r", stdin); int index = 0, num; /// bis zum Ende der Datei scannen while (scanf ("% d", & num) == 1) { Array [Index ++] = num; }} für (int i = 0; i printf ("% d", Array [i]); printf ("\ n"); return 0;}}

Antwort 8:

Sie könnten gerne anfangen zu lernen, wie man programmiert ...

Die Textdatei enthält also Ziffern (ASCII 48..57, möglicherweise 'e' und '-' und '.') Und Trennzeichen (ASCII 13,10,9,32, was auch immer Ihr Gift ist).

Sie weisen also ein ausreichend großes int, long int für jedes Array zu und beginnen, es zu füllen, während Sie die Datei byteweise oder stringweise bis zum nächsten Trennzeichen analysieren.

Sie wissen, warum mein Gehalt hoch ist? Weil ich das alleine gemacht habe, viel Zeit investiert habe und die Arbeitgeber das wissen.


Antwort 9:

Sie müssen im Internet ein Dienstprogramm finden, das Ihre Textdatei in C-Array konvertiert. Wenn Ihre Textdatei im CSV-Format (durch Kommas getrennte Werte) geschrieben ist, werden Sie wahrscheinlich keine Probleme haben, ein solches Dienstprogramm zu finden. Mit anderen Worten, Ihre Textdatei muss einem bekannten Standard entsprechen. In diesem Fall können Sie sie problemlos in ein C-Array konvertieren.


Antwort 10:

Der klassische C-Weg wäre, fscanf zu verwenden

Ein C ++ - Weg könnte darin bestehen, ifstream zusammen mit stringstream zu verwenden.

Möglicherweise benötigen Sie nicht einmal den Stringstream.