Zum Inhalt springen

Textdatei (10000 Zeilen) in Array schreiben


Empfohlene Beiträge

  • Antworten 60
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

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

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);

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

Geschrieben

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

}

}

Geschrieben

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.

Geschrieben
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?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...