Datei einlesen/ausgeben



  • Hallo,

    ich will ein Programm schreiben, mit dem ich eine Textdatei erstelle, schließe und wieder öffnen lasse (mit 2 unterschiedlichen strings - quasi als beweis das er zum Schluss wirklich ausliest und nicht den vorherigen string übernehme).

    Hier erstmal der Quellcode:

    #include "stdafx.h"
    #include <stdio.h>
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>

    #define _CRT_SECURE_NO_WARNINGS
    #define Max_Zeichen 200
    #define Min_Zeichen 20

    using namespace std;

    void main()
    {
    char cZeichenkette[Max_Zeichen], cZeichenkette2[Max_Zeichen];
    system("color 1E");
    FILE * file = 0;
    cout<<"Geben sie den Text ein: "; // Texteingabe welche in .txt gespeichert werden soll
    fgets(cZeichenkette, 100, stdin); fflush(stdin);
    fopen_s(&file, "beispiel.txt", "w"); // Erstellen einer Textdatei "beispiel.txt"
    fprintf_s(file, cZeichenkette); // Eingegebener text wird in die .txt geschrieben
    fclose(file); // .txt wird geschlossen und gespeichert

    cout << "Das File wurde geschlossen und wird ";
    cout << "jetzt wieder geoeffnet und gelesen ";
    getchar();

    fopen_s(&file, "beispiel.txt", "r"); // Wiederholtes öffnen der .txt
    fscanf_s(file, "%s", &cZeichenkette2); fflush(stdin); // Übergeben des textes in den String
    cZeichenkette2[Max_Zeichen] = '\0';
    cout<<"Ihr vorher eingegebener text: %s", cZeichenkette2;
    fclose(file);
    getchar();
    }

    das Programm funktioniert bis zum wiederholten öffnen der .txt, bloß dann nimmt cZeichenkette2 nicht die Wörter im text an, sondern gibt lediglich %s aus...

    wäre cool wenn hier jemand den Fehler finden würde, ich will erst das Programm zum laufen bringen und dann optimieren.
    wenn jemand Verbesserungsvorschläge hat, wär ich dankbar, auch wenn etwas in c geschrieben ist, würde gern alles in c++ schreiben.

    Danke im Voraus 🙂

    The-_-Freak



  • The-_-Freak schrieb:

    cout<<"Ihr vorher eingegebener text: %s", cZeichenkette2;

    Und du meinst, das soll funktionieren?

    fflush(stdin);

    Tipp: Lern entweder C oder C++. Dieser Mix davon bringt dich völlig durcheinander.



  • Wenn du schon den ganzen Securekram von Microsoft nimmst, dann lies dir auch durch, wie man die Funktionen verwendet.
    Da reicht es nicht aus, ein _s an den Namen der Standardfunktionen zu hängen.
    Die wollen mehr Paramteter haben.

    Such mal (im Internet) nach: msdn fscanf_s

    Bei cZeichenkette2[Max_Zeichen] = '\0'; schreibst du über das Array hinaus.

    cout kennt keine Formatspecifier. Das ist nicht printf .



  • //#include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
    	std::string str1, str2;
    
    	//system("color 1E");
    
    	std::cout << "Geben sie den Text ein: ";
    	std::getline(std::cin, str1);
    	{
    		std::ofstream of("beispiel.txt");
    		of << str1;
    	} // implizites .close()
    
    	std::cout << "Das File wurde geschlossen und wird ";
    	std::cout << "jetzt wieder geoeffnet und gelesen\n";
    
    	{
    		std::ifstream ifs("beispiel.txt");
    		std::getline(ifs, str2);
    	} // implizites .close()
    	std::cout << "Ihr vorher eingegebener text: " << str2 << "\n";
    
    	return 0; // auch implizit da
    }
    

    Um mal das gröbste beseitigt zu haben...



  • fflushe schrieb:

    The-_-Freak schrieb:

    cout<<"Ihr vorher eingegebener text: %s", cZeichenkette2;

    Und du meinst, das soll funktionieren?

    fflush(stdin);

    Tipp: Lern entweder C oder C++. Dieser Mix davon bringt dich völlig durcheinander.

    Danke, ich weiß, wir haben in der uni bloß erst c und jetzt immer mehr c++ gemacht.. letztendlich müssen wir beides können, das mit dem cout habe ich jetzt erstmal gelöst 🙂



  • DirkB schrieb:

    Wenn du schon den ganzen Securekram von Microsoft nimmst, dann lies dir auch durch, wie man die Funktionen verwendet.
    Da reicht es nicht aus, ein _s an den Namen der Standardfunktionen zu hängen.
    Die wollen mehr Paramteter haben.

    Such mal (im Internet) nach: msdn fscanf_s

    Bei cZeichenkette2[Max_Zeichen] = '\0'; schreibst du über das Array hinaus.

    cout kennt keine Formatspecifier. Das ist nicht printf .

    Sehr gut, danke, hat mich am meisten weiter gebracht, hab aber noch ein paar fragen:
    1. gibt es in c++ keine andere möglich keit ausser cout zu verwenden? vor allem wenn man mehrere variablen hat die mit ausgegeben werden sollen? weil ständig <<...<<..<<.. nervt, da war printf um einiges komfortabler.
    2. int fscanf_s(
    FILE *stream,
    const char *format [,
    argument ]...
    was wird hier mit [, argument] gemeint?
    3. mein code sieht jetzt folgendermaßen aus:

    void main()
    {
    char cZeichenkette[Max_Zeichen], cZeichenkette2[Max_Zeichen];
    system("color 1E");
    FILE * file = 0;
    cout<<"Geben sie den Text ein: "; // Texteingabe welche in .txt gespeichert werden soll
    fgets(cZeichenkette, 100, stdin); fflush(stdin);
    fopen_s(&file, "beispiel.txt", "w"); // Erstellen einer Textdatei "beispiel.txt"
    fprintf_s(file, cZeichenkette); // Eingegebener text wird in die .txt geschrieben
    fclose(file); // .txt wird geschlossen und gespeichert

    cout << "Das File wurde geschlossen und wird ";
    cout << "jetzt wieder geoeffnet und gelesen ";
    getchar();

    fopen_s(&file, "beispiel.txt", "r"); // Wiederholtes öffnen der .txt
    fscanf_s(file, cZeichenkette2, stdin); // Übergeben des textes in den String
    cout << "Ihr Text: " << cZeichenkette2 << "\n";
    fclose(file);
    getchar();
    }

    es wird jetzt schön brav die Zeichenkette übergeben, aber dahinter mit ganz vielen Zeichen wie |||| usw. an was liegt das?

    Vielen Dank schonmal im voraus 🙂



  • The-_-Freak schrieb:

    1. gibt es in c++ keine andere möglich keit ausser cout zu verwenden? vor allem wenn man mehrere variablen hat die mit ausgegeben werden sollen? weil ständig <<...<<..<<.. nervt, da war printf um einiges komfortabler.

    printf gehört immer noch zur Standardlibrary von C++.
    cout hat den Vorteil, dass es Typsicher ist.
    Bei printf muss der Formatstring zu den weiteren Parametern passen.

    The-_-Freak schrieb:

    2. int fscanf_s(
    FILE *stream,
    const char *format [,
    argument ]...
    was wird hier mit [, argument] gemeint?

    Über den Formatstring (das ist das Ding mit den % drin) format gibst du an, was du einlesen möchtest.
    Der funktioniert so wie bei scanf auch.
    Dann musst du noch angeben, wohin der Kram geschrieben werden soll.
    Bei fscanf_s kommen noch ein paar Größenangaben dazu, damit man nicht über Arraygrenzen schreibt. Steht alles in der MSDN

    The-_-Freak schrieb:

    fscanf_s(file, cZeichenkette2, stdin); // Übergeben des textes in den String

    Ist ganz ganz großer Quatsch. Wo ist der Formatstring, was soll das stdin?
    Programmieren ist nicht Buchstaben ändern bis es funktioniert.

    The-_-Freak schrieb:

    3. mein code sieht jetzt folgendermaßen aus:

    Wann packkst du deinen Code endlich mal zwischen Code-Tags. Dann bleibt die Formatierung erhalten und da Zeug ist lesbarer.
    Ist ganz einfach: Code mit der Maus markieren und auf den C++-Button unter dem 😞 clicken.



  • DirkB schrieb:

    The-_-Freak schrieb:

    fscanf_s(file, cZeichenkette2, stdin); // Übergeben des textes in den String

    Ist ganz ganz großer Quatsch. Wo ist der Formatstring, was soll das stdin?
    Programmieren ist nicht Buchstaben ändern bis es funktioniert.

    The-_-Freak schrieb:

    3. mein code sieht jetzt folgendermaßen aus:

    Wann packkst du deinen Code endlich mal zwischen Code-Tags. Dann bleibt die Formatierung erhalten und da Zeug ist lesbarer.
    Ist ganz einfach: Code mit der Maus markieren und auf den C++-Button unter dem 😞 clicken.

    Also erstmal danke! ich dachte, da es im fgets vorkommt (stdin), braucht man es evtl hier auch..

    also sollte ich schreiben:

    fscanf_s(file, "%s", cZeichenkette2)
    

    oder

    fcanf_s(file,"%s", &cZeichkette2)
    

    danke, wusste nicht wie man das in die Code-Tags packt 🙂

    ah, ich habs jetzt mit fscanf_s(file, "%s", cZeichenkette2, Max_Zeichen);
    probiert, funktioniert so weit, bloß ein problem gibt es und zwar, dass es nur das erst (wie bei strings üblich) einließt, kann ich es auch so umändern, dass es sätze einließt?
    wenn möglich nur mit dem vorhandenen, bekannten methoden meines Programms :S
    oder mit einfachen methoden 🙂



  • The-_-Freak schrieb:

    ich dachte, da es im fgets vorkommt (stdin), braucht man es evtl hier auch..

    Warum steht denn das stdin in dem Fall bei fgets an dritter Stelle?

    The-_-Freak schrieb:

    kann ich es auch so umändern, dass es sätze einließt?

    Ja. Am einfachsten ist fgets .
    http://www.cplusplus.com/reference/cstdio/fgets/

    Geht auch mit scanf mit dem [^ Specifier :
    http://www.cplusplus.com/reference/cstdio/scanf/



  • DirkB schrieb:

    The-_-Freak schrieb:

    ich dachte, da es im fgets vorkommt (stdin), braucht man es evtl hier auch..

    Warum steht denn das stdin in dem Fall bei fgets an dritter Stelle?

    The-_-Freak schrieb:

    kann ich es auch so umändern, dass es sätze einließt?

    Ja. Am einfachsten ist fgets .
    http://www.cplusplus.com/reference/cstdio/fgets/

    Geht auch mit scanf mit dem [^ Specifier :
    http://www.cplusplus.com/reference/cstdio/scanf/

    Ich glaube weil es den Tastaturpuffer quasi einliest?
    also bedeutet die 3. stelle, was eingelesen werden soll?
    die 2. wie groß es höchstens sein darf und die 1. in welchen, in diesem fall string es einglesen werden soll??

    Also es läuft übrigens, dankeschön für die Hilfe 🙂



  • The-_-Freak schrieb:

    Also es läuft übrigens, dankeschön für die Hilfe 🙂

    Das heißt aber leider nicht, dass es auch richtig ist.



  • DirkB schrieb:

    The-_-Freak schrieb:

    Also es läuft übrigens, dankeschön für die Hilfe 🙂

    Das heißt aber leider nicht, dass es auch richtig ist.

    Warum sollte es nicht richtig sein?
    Gibt weder Warnungen noch errors aus...



  • Sowas z.B.

    fprintf_s(file, cZeichenkette); // Eingegebener text wird in die .txt geschrieben
    

    Gib mal bei der Eingabe einen Text mit einem Formatspecifier ein. %p oder %f oder %s oder ...

    Oder

    #define Max_Zeichen 200
    ...
    char  cZeichenkette2[Max_Zeichen]; 
    ....
    cZeichenkette2[Max_Zeichen] = '\0';
    

    Keine Fehler, trotzdem falsch.


Anmelden zum Antworten