Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Textdatei (10000 Zeilen) in Array schreiben

Empfohlene Antworten

Fragezeichen

  • Antworten 60
  • Ansichten 13.7k
  • Erstellt
  • Letzte Antwort
Bin ich auf dem richtigen Weg?
Keine Ahnung. Du hast immer noch nicht gesagt, wozu du die zweite Map brauchst. Wenn da dasselbe drinstehen soll wie in der ersten, ist sie überflüssig.

Ist das überhaupt möglich. Inhalt einer map in eine andere map einzufügen?
Wenn die Templateparameter gleich sind, kannst du einfach zuweisen.

Morgen,

hab mal wieder ne Frage...;)!

Wieso springt das Programm nicht aus meiner Schleife raus, obwohl die Bedingung erfüllt wird (Datei ist im Quellvz vorhanden und somit ist in.good=1).

Ich zuerst eine Datei an, die nicht vorhanden ist, der Aufruf wiederholt sich und ich gebe erneut an Datei an, die nicht vorhanden ist.

Nun möchte ich den positiven Fall testen und gebe eine Datei an, die vorhanden ist. Allerdings findet die Schleife keinen Abschluss.

Quelltext:

printf("Enter a number to select a choice: ");

scanf("%i",&select);

getchar();

if (select==1 || select ==2 )

{

std::ifstream in;

do

{

printf("Please enter the first file for analyzing: \n");

cin >> eingabe;

//Einlesen der Datei

std::ifstream in(eingabe.c_str(), ios::in);

if (!in)

{

cerr<<"ERROR! Cannot open "<<eingabe<< "\n\n";

/* printf("Please enter the first file for analyzing: \n");

cin >> eingabe;

*/

//exit(-1);

}

cout << in.good() << endl;

//Abfrage ob Dateien vorhanden

if (in.good()==0)

cout << "schleife" << endl;

}while(!in.good()==0);

hab mal wieder ne Frage...;)!
Geht es immer noch um "Textdatei in Array schreiben"? Falls nicht, mach bitte einen neuen Thread dafür auf.

Ein Thema - ein Thread.

Wieso springt das Programm nicht aus meiner Schleife raus, obwohl die Bedingung erfüllt wird
Zeig bitte mal das ganze Programm, eigentlich sollte sich das nicht übersetzen lassen, es sei denn, es gibt da noch eine andere Variable namens in. Du kannst in der Schleifenbedingung einer do/while-Schleife nicht auf eine Variable zugreifen, die innerhalb des Schleifenblocks definiert ist.

Und benutz bitte Code-Tags, damit die Einrückung erhalten bleibt.

Und misch nicht printf/scanf und cin/cout, die müssen nicht gegeneinander synchronisiert sein.

Ja es handelt sich immer noch um den gleichen Thread.

Code-Tags habe ich leider noch nicht berücksichtigt und und printf bzw. cout werde ich im Anschluss synchronisieren.

/Hauptprogramm

int _tmain()

{

//Datum- und Zeifunktion zur Angabe der Bearbeitungszeit

time_t t;

time(&t);

int select=0;

//String für Eingabe der Datei

string eingabe;

string eingabe2;

printf("###################################################################\n\n");

printf("In the following tool you insert files for comparison.\n");

printf("Please pay attention that both files exist...\n\n");

printf("###################################################################\n");

printf("##############################KONTEXTMENU##########################\n");

printf("## [1]Only show multiple path ##\n");

printf("## [2]Only show single path ##\n");

printf("## !!Other entries cause an exit!! ##\n");

printf("###################################################################\n");

printf("###################################################################\n");

printf("Enter a number to select a choice: ");

scanf("%i",&select);

getchar();

if (select==1 || select ==2 )

{

std::ifstream in;

do

{

printf("Please enter the first file for analyzing: \n");

cin >> eingabe;

//Einlesen der Datei

std::ifstream in(eingabe.c_str(), ios::in);

if (!in)

{

cerr<<"ERROR! Cannot open "<<eingabe<< "\n\n";

}

cout << in.good() << endl;

//Abfrage ob Dateien vorhanden

if (in.good()==0)

cout << "schleife" << endl;

}while((int)in.good()==0);

printf("Please enter the second file for analyzing: \n");

cin >> eingabe2;

//Einlesen der Datei

std::ifstream in2(eingabe2.c_str(), ios::in);

if (!in2)

{

cerr<<"ERROR! Cannot open "<<eingabe2<< "\n\n";

}

}

else

{

cout << "CANCEL AND EXIT..."<< endl;

exit(-1);

}

//--------------------------------------------------------------

//Deklaration zum Auslesen der Zeilen

std::string line;

std::string line2;

std::ifstream in(eingabe.c_str(), ios::in);

std::ifstream in2(eingabe2.c_str(), ios::in);

//Aufruf der Klasse map und Angabe des Namens

std::map<string,int> StrMap;

std::map<string,int> StrMap2;

//Schleife zum Durchlauf der ersten Datei und einlesen jeder Zeile

while(std::getline(in, line))

{

//Prüfung ob Zeilen den Anforderungen entspricht

if(line.length() > 0 && line[0] == '[')

{

//Falls Prüfung zutrifft wird die Zeile im ersten Durchlauf in der map angelegt,

//bei allen weiteren wird der Zähler erhöht

++StrMap[line];

}

}

//Schleife zum Durchlauf der ersten Datei und einlesen jeder Zeile

while(std::getline(in2, line2))

{

//Prüfung ob Zeilen den Anforderungen entspricht

if(line2.length() > 0 && line2[0] == '[')

{

++StrMap2[line2];

//increment(StrMap[line]); //Falls Prüfung zutrifft wird die Zeile

//im ersten Durchlauf in der map angelegt, bei allen weiteren wird der Zähler erhöht

}

}

okay.werd ich beim nächsten Mal einhalten;).


std::ifstream [B][COLOR="red"]in[/COLOR][/B];

do
{

printf("Please enter the first file for analyzing: \n");
cin >> eingabe;

//Einlesen der Datei
std::ifstream [B][COLOR="blue"]in[/COLOR][/B](eingabe.c_str(), ios::in);
if (!in)
{
cerr<<"ERROR! Cannot open "<<eingabe<< "\n\n";
}

cout << in.good() << endl;

//Abfrage ob Dateien vorhanden
if (in.good()==0)
cout << "schleife" << endl;

}while((int)[COLOR="red"]in[/COLOR].good()==0);[/code]

Da haben wir's doch: Du hast 2 Variablen namens in, eine außerhalb der Schleife (rot markiert) und eine innerhalb.

In der Schleifenbedingung ist die blaue aber nicht mehr gültig, also wird dort die rote benutzt. Damit hast du nie etwas gemacht, also liefert good hier immer false.

Code-Tags bedeutet, dass du um den Code hier im Forum solche Markierungen setzt:

[CO[size=2]D[/size]E]Hier der Code[/CO[size=2]D[/size]E].

Dann passt's auch mit der Formatierung.

Okay.aber das rote in kann ich ja nicht entfernen, da es sonst innerhalb der Bedingung als undeclared identifier gilt.

Okay.aber das rote in kann ich ja nicht entfernen, da es sonst innerhalb der Bedingung als undeclared identifier gilt.
Das ist eine unsinnige Begründung. Mit dem roten in erreichst du nur, dass dein Programm zwar übersetzt werden kann, aber trotzdem nicht funktioniert.

- Das rote "in" muss weg.

- Das blaue "in" muss in der Schleife bleiben.

- Du brauchst die Statusinformation des blauen "in" in der Schleifenbedingung.

Lösung: Leg außerhalb der Schleife eine bool-Variable an, die den Rückgabewert von in.good() in der Schleife speichert. Diese Variable kannst du dann für die Schleifenbedingung nutzen.

Warum überhaupt der Cast auf int? Angst vor bool?

Okay. Hat super funktioniert.Danke

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.