C++ Leerzeichen und Buchstaben in Datei schreiben



  • Hallo, erst mal da ich neu hier bin!
    Also, zuerst einmal ich programmiere erst seit gut einer Woche darum bitte nicht auslachen!
    Mein Problem:
    Ich habe einen "Editor" für Dos-Prompt geschrieben.
    Mit den Funktionen: Datei anlegen und beschreiben
    Datei löschen
    etc.
    Nun meine Frage: Wie kann ich einen Text in eine Datei schreiben, heißt mit Leerzeichen(ohne funktioniert es ja).
    Der Code:
    Achtung: Es sind noch nicht alle switch anweisungen mit einer Funktion ausgestattet!

    // Editor für Ein und Ausgabe
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    struct editor
    	{
    	string x;
    	string tmp;
    	char y;
    	};
    
    editor read_in()
    	{
    		ifstream dat_ein;
    		editor einlesen;
    
    cout << endl;
    cout << "Geben Sie den Namen\\Pfad zur Datei ein: ";
    cin >> einlesen.x;
    cout << endl;
    
    		dat_ein.open(einlesen.x.c_str(), ios_base::out);
    
    if(!dat_ein)
    	{
    cout << "Datei konnte nicht geöffnet werden: " << endl;
    cout << endl;
    	}
    
    		while(!dat_ein.eof())
    			{
    		dat_ein.get(einlesen.y);
    		cout << einlesen.y;
    			}
    dat_ein.close();
    fflush(stdin);
    getchar();
    		return einlesen;
    }
    /* Hier liegt das Problem! und zwar bei: 
    cout << "Text eingeben: ";
    cin >> lesen.tmp;
    dateiname << lesen.tmp << endl;
    Wenn ich einen Text eingebe werden nur die Buchstabe bis zu einem Leerzeichen
    in die Datei geschrieben! Soll ich es mit einem char Datentype versuchen, ja? aber wie?*/
    
    editor write_in()
    	{
    	ofstream dateiname;
    	editor lesen;
    
    	cout << endl;
    	cout << "Geben Sie den Pfad an in dem Sie die Datei amlegen wollen: ";
    	cin >> lesen.x;
    	cout << endl;
    
    	dateiname.open(lesen.x.c_str(), ios_base::out);
    
    	if(!dateiname)
    		{
    		cout << "Datei kann nicht angelegt werden," << endl;
    		cout <<  "bzw. der Pfad >> " << lesen.x << " << existiert nicht!" << endl;
    		}
    
    	cout << "Text eingeben: ";
    	cin >> lesen.tmp;
    
    	dateiname << lesen.tmp << endl;
    
    return lesen;
    }
    
    int main()	{
    
    	int befehl;
    
    	cout << "\t\t\t-----------------------------------" << endl;
    	cout << "\t\t\t| Editor mit folgenden Funktionen:|" << endl;
    	cout << "\t\t\t| Copyright Anonym                 |" << endl;
    	cout << "\t\t\t-----------------------------------" << endl;
    	cout << endl;
    	cout << "Datei einlesen und ausgeben\t\t<1>" << endl;
    	cout << "Datei erstellen und beschreiben\t\t<2>" << endl;
    	cout << "Datei erweitern\t\t\t\t<3>" << endl;
    	cout << "Datei ueberschreiben\t\t\t<4>" << endl;
    	cout << "Programm beenden\t\t\t<5>" << endl;
    cout << endl;
    cout << "Ihre Eingabe: ";
    cin >> befehl;
    
    	switch(befehl)
    		{
    	case 1: 
    		cout << endl;
    		cout << "Datei einlesen und ausgeben" << endl;
    		read_in();
    		break;
    	case 2: 
    		cout << endl;
    		cout << "Datei erstellen und beschreiben" << endl;
    		write_in();
    		break;
    	case 3: 
    		cout << endl;
    		cout << "Datei erweitern" << endl;
    		break;
    	case 4: 
    		cout << endl;
    		cout << "Datei überschreiben" << endl;
    		break;
    	case 5:
    		cout << endl;
    		cout << "Programm beenden" << endl;
    		break;
    	default: 
    		cout << endl;
    		cout << "Ungueltige Eingabe" << endl;
    		break;
    		}
    return 0;
    }
    


  • Dein Problem ist einfach zu lösen.

    Der Befehl write.'dateistream'(String oder char Array,Anzahl der zu schreibenden bytes=länge des Strings);
    .



  • Noch n Tip:

    Wenn die Abbruchbedingung (!datei) erfüllt wird, solltest du die Funktion mit einem return x beenden und nicht einfach weiter laufen lassen. Außerdem solltest du bevor du while(!datei.eof()) schreibst einmal aus der Datei lesen, da eof() erst dann ein richtiges Ergebnis liefert.

    Für eine Woche programmieren ist das aber schon nicht schlecht ;).



  • Könnte mir das mit dem write.'dateistream'();
    Mal vorzeigen da mein Compiler immer eine Fehlermeldung ausgibt!
    Ansonsten vielen Dank für die schnelle hilfe!



  • versuchs mal mit datei.put(char);



  • Bitte vor zeigen!
    Kopiert einfach den Source und ändert ihn da mein Compiler immer nur Fehlermeldungen ausgibt!
    Außerdem kenne ich die Parameter ja nicht!

    mfg Jakob Buchgraber



  • Put setzt doch nur ein Zeichen,oder nicht?

    ofstream txt("test.txt",ios::out);
    
    char name[1025];
    cin>>name;
    txt.write(name,1024);
    txt.close;
    

    Ich hoffe das hilft.



  • also ich hätte es so gemacht:

    struct ...{
    .
    char tmp[256];
    .
    };
    
    ....
    
    editor write_in() 
        { 
        ofstream dateiname; 
        editor lesen; 
    
        cout << endl; 
        cout << "Geben Sie den Pfad an in dem Sie die Datei amlegen wollen: "; 
        cin >> lesen.x; 
        cout << endl; 
    
        dateiname.open(lesen.x.c_str(), ios_base::out); 
    
        if(!dateiname) 
            { 
            cout << "Datei kann nicht angelegt werden," << endl; 
            cout <<  "bzw. der Pfad >> " << lesen.x << " << existiert nicht!" << endl;
            return 1; 
            } 
    
        cout << "Text eingeben: "; 
        cin.getline(lesen.tmp, 256);
    
        for(int i = 0; i < sizeof(lesen.tmp); i++)
           dateiname.put(lesen.tmp[i]); 
    
    return lesen; 
    }
    

    Du siehst es liegt nicht am schreiben sondern am lesen mit cin. cin deutet jedes leerzeichen als ende der eingabe, der rest bleibt im puffer.



  • Hallo erst mal. ich bin auch ein ganz lausiger anfänger. 🙄
    wie müsste dann das ganze richtig aussehen?

    mfg. smista



  • öhm ... steht doch einen Beitrag weiter oben 🙄



  • nein ich meine von anfang an. das ist ja nur ein teil.

    mfg. smista



  • najut habs nochmal so geschrieben wie ichs gemacht hätte:

    #include <iostream> 
    #include <fstream>
    #include <conio.h>
    
    using namespace std; 
    
    struct editor 
    { 
     char x[256]; 
     char tmp[256]; 
     char y; 
    };
    
    short read_in() 
    { 
     ifstream dat_ein; 
     editor einlesen; 
     int i;
    
     cout << endl; 
     cout << "Geben Sie den Namen\\Pfad zur Datei ein: "; 
     cin >> einlesen.x; 
     cout << endl; 
    
     dat_ein.open(einlesen.x, ios::in | ios::binary); 
    
     if(!dat_ein) 
     { 
      cout << "Datei konnte nicht geöffnet werden: " << endl; 
      cout << endl; 
      return 1;
     } 
    
     dat_ein.get(einlesen.y);
    
     while(!dat_ein.eof())
     { 
      cout << einlesen.y; 
      dat_ein.get(einlesen.y);
     } 
     dat_ein.close(); 
     return 0; 
    }
    
    short write_in() 
    { 
     ofstream datei_aus; 
     editor lesen; 
     int pos = 0;
     char c;
    
     cout << endl; 
     cout << "Geben Sie den Pfad an in dem Sie die Datei anlegen wollen: "; 
     cin >> lesen.x; 
     cout << endl; 
    
     datei_aus.open(lesen.x, ios::out | ios::binary ); 
    
     if(!datei_aus) 
     { 
      cout << "Datei kann nicht angelegt werden," << endl; 
      cout << "bzw. der Pfad >> " << lesen.x << " << existiert nicht!" << endl; 
      return 1;
     } 
    
     cout << "Text eingeben: ";
    
     c=getche(); //der "Nachteil" von getche() ist das auch Backspaces etc eingelesen werden
     while(c!=13)
     {
      if (c > 31) lesen.tmp[pos++]=c; // deswegen diese if Bedingung
      else if ( c == 8) pos-=1; // wenn Backspace muß die voherige Position überschrieben werden
      c=getche();  
     } 
     lesen.tmp[pos]='\0';
     pos=0; 
    
     cout << "\n\n Text wird in Datei geschrieben!\n\n\n";
    
     for(int i = 0; i < strlen(lesen.tmp); i++) 
           datei_aus.put(lesen.tmp[i]); 
    
     datei_aus.close();
     return 0; 
    } 
    
    int main()    
    { 
     int befehl = 1, indikator;
     cout << "\t\t\t-----------------------------------" << endl; 
     cout << "\t\t\t| Editor mit folgenden Funktionen:|" << endl; 
     cout << "\t\t\t| Copyright Anonym                 |" << endl; 
     cout << "\t\t\t-----------------------------------" << endl; 
     cout << endl; 
     while(befehl)
     {
      cout << "Datei einlesen und ausgeben\t\t<1>" << endl; 
      cout << "Datei erstellen und beschreiben\t\t<2>" << endl; 
      cout << "Datei erweitern\t\t\t\t<3>" << endl; 
      cout << "Datei ueberschreiben\t\t\t<4>" << endl; 
      cout << "Programm beenden\t\t\t<5>" << endl; 
      cout << endl; 
      cout << "Ihre Eingabe: "; 
      cin >> befehl;  
    
      switch(befehl) 
      { 
      case 1:  cout << endl; 
               cout << "Datei einlesen und ausgeben" << endl; 
               indikator = read_in(); 
               break; 
      case 2:  cout << endl; 
               cout << "Datei erstellen und beschreiben" << endl; 
               indikator = write_in(); 
               break; 
      case 3:  cout << endl; 
               cout << "Datei erweitern" << endl; 
               break; 
      case 4:  cout << endl; 
               cout << "Datei überschreiben" << endl; 
               break; 
      case 5:  cout << endl; 
               cout << "Programm beenden" << endl; 
               break; 
      default: cout << endl; 
               cout << "Ungueltige Eingabe" << endl; 
               break; 
      } 
      if(indikator == 1) cout << "\nEin Fehler ist aufgetreten!\n\n";
      cout << "Erneut einen Befehel ausführen? Wenn ja 1, ansonsten 0 eintippen:";
      cin >> befehl;
      cout << "\n\n\n";
     }
     return 0; 
    }
    

    mfg nob

    edit:
    anstatt von

    c=getche(); //der "Nachteil" von getche() ist das auch Backspaces etc eingelesen werden
     while(c!=13)
     {
      if (c > 31) lesen.tmp[pos++]=c; // deswegen diese if Bedingung
      else if ( c == 8) pos-=1; // wenn Backspace muß die voherige Position überschrieben werden
      c=getche();  
     } 
     lesen.tmp[pos]='\0';
     pos=0;
    

    kann man auch

    cin.seekg(0,std::ios::end);
     cin.clear();
     cin.getline(lesen.tmp, 256);
     cin.seekg(0,std::ios::end);
     cin.clear();
    

    schreiben was wahrscheinlich Laufzeit und Speicher einspart



  • D A N K E ! !
    Jetzt funktioniert es.
    mfg jakob buchgraber


Anmelden zum Antworten