Ekinlesen von Datei bricht nach Leerzeichen oder Eingabezeichen ab



  • Moin.

    Ich habe das Problem, dass ich eine Datei auslesen möchte. Allerdings zeigt er mir nur an, was vor einem Leer- oder Eingabezeichen steht.

    datei_lieferanten.open("lieferanten.txt", ios::in);
    		datei_lieferanten >>  lieferanten;
    		datei_lieferanten.close();
    		printf_s("%s", lieferanten);
    

    Das SChreiben in die datei funktioniert jedoch wie gewünscht.


  • Mod

    Was ist Lieferanten? Ein char-Array? Dann ist dies das erwartete Verhalten, denn der Operator >> trennt normalerweise alles nach Whitespaces auf (und lässt diese selbst auch ganz weg). Das ist ja gerade der Sinn der formatierten Eingabeaktionen. Wenn du dies nicht möchtest, benutz unformatierte Eingaben oder lies direkt in einen Streambuf ein(da wird standardmäßig alles auf einmal eingelesen). Du möchtest ja anscheinend die ganze Datei auf einmal einlesen und ausgeben - praktischerweise gibt es ja schon einen Ausgabestream und dieser hat natürlich auch einen Streambuf:

    ifstream lieferanten("lieferanten.txt");
      lieferanten >> cout.rdbuf();
    

    Und noch etwas: Wenn du als Anfänger in einem C++-Programm printf oder char-Arrays benutzt, machst du normalerweise etwas grundlegend falsch. Nutze die C++-Mittel. Die Sprachmittel von C und von C++ vertragen sich nämlich nicht so gut, mit einer Mischung bekommst du bloß Probleme.



  • :: glaskugel an , da wichtige Informationen wie zB die Typen von datei_lieferanten und lieferanten fehlen ::

    Schau dir mal die Beschreibung der << >> an. Ist das eine ein ifstream und das andere ein std::string könnte es möglicherweise so sein das der einfach nur bis zum ersten whitespace liest? Da gibts auch sowas das nennt sich getline() ...

    http://www.cplusplus.com/reference/iostream/ifstream/



  • SeppJ schrieb:

    Was ist Lieferanten? Ein char-Array? Dann ist dies das erwartete Verhalten, denn der Operator >> trennt normalerweise alles nach Whitespaces auf (und lässt diese selbst auch ganz weg). Das ist ja gerade der Sinn der formatierten Eingabeaktionen. Wenn du dies nicht möchtest, benutz unformatierte Eingaben oder lies direkt in einen Streambuf ein(da wird standardmäßig alles auf einmal eingelesen). Du möchtest ja anscheinend die ganze Datei auf einmal einlesen und ausgeben - praktischerweise gibt es ja schon einen Ausgabestream und dieser hat natürlich auch einen Streambuf:

    ifstream lieferanten("lieferanten.txt");
      lieferanten >> cout.rdbuf();
    

    Hatte das jetzt so geändert:

    case 2:
    		datei_lieferanten.open("lieferanten.txt", ios::in);
    		datei_lieferanten >>  lieferanten;
    		ifstream lieferanten("lieferanten.txt"); 
    		lieferanten >> cout.rdbuf(); 
    		datei_lieferanten.close();
    		printf_s("%s", lieferanten);
    		break;
    

    Erhalte jedoch den Fehler:
    Fehler 1 error C2360: Initialisierung von 'lieferanten' durch 'case'-Marke übersprungen z:\eigene dateien\visual studio 2005\projects\projektmappe\uebungsprojekt2_09-09-10\uebungsprojekt.cpp 79



  • So geht's (Klammern!):

    Basinator schrieb:

    case 2:
        {
     	datei_lieferanten.open("lieferanten.txt", ios::in);
     	datei_lieferanten >>  lieferanten;
     	ifstream lieferanten("lieferanten.txt"); 
     	lieferanten >> cout.rdbuf(); 
     	datei_lieferanten.close();
     	printf_s("%s", lieferanten);
     	break;
        }
    


  • Hm, ohne den ifstrem geht es komischerweise auch ohne.

    Allerdings wird scheinbar das erste Wort bei der Ausgabe abgeschnitten, in der Textdatei ist es vorhanden.



  • Basinator schrieb:

    Hm, ohne den ifstrem geht es komischerweise auch ohne.

    Das macht auch Sinn so. Die Lebensdauer einer Variable wird immer über ihren Scope definiert, und der wird nunmal über geschweifte Klammern festgelegt. Wenn du nun eine Variable einfach so unter einem case deklarierst, dann kann diese Deklaration je nach Verlauf des Programms übersprungen werden. Eine eventuelle Nutzung der Variable weiter unten wäre dann ja gar nicht möglich. Daher musst du explizit sagen, dass die Variable nur in diesem case-Zweig existieren soll. Denn so ein case-Statement ist nur eine Sprungmarke, weniger ein Block, bei dem Anfang und Ende fest definiert sind (z.B. kann ja von einem in den nächsten case-Zweig übergegangen werden).


Anmelden zum Antworten