Text in Datei schreiben



  • Hallo, ich bin ein absoluter Neuling in C, von welchen Sprachen ich komme sag ich hier besser nicht 😃

    Lese also gerade ein paar Anleitungen und folgendes klappt bei mir nicht:

    Handelt sich um eine Konsolenanwendung (falls ich dadurch im falschen Bereich gelandet bin, sorry bitte verschieben)

    Original von Sebastian Cyris \ PCD Bascht

    void main ( void )  
    { 
    FILE *datei; 
    char dateiname[25]; 
    char zeichen; 
    char abbruch = '#'; 
    
    printf ("\nBitte Dateinamen angeben : "); 
    scanf ("%s",dateiname); 
    
    datei = fopen ( dateiname , "w+" ); 
    
    if (datei == NULL )  
    { 
    printf ("\nDie Datei konnte nicht geöffnet werden!\n");
    } 
    else 
    { 
    printf ("\nText eingeben, beenden mit # \n\n"); 
    while (( zeichen = getchar()) != abbruch ) putc (datei,zeichen); 
    printf ("\n\nDanke, das sie mich benutzten\n\n"); 
    fclose (datei); 
    }
    }
    

    Text eingeben bis Abbruchzeichen:

    FILE *datei;
    	char dateiname[25];
    	char abbruch;
    	char zeichen;	// Für Text, wird Zeichenweise eingelesen
    
    // hier steht noch mehr ;-)
    
    		while((zeichen = getchar()) != abbruch) {
    			putc(datei,zeichen);
    
    		}
    

    es geht nur leider nicht er meckert immer wie folgt:

    error C2664: 'putc': Konvertierung des Parameters 1 von 'FILE *' in 'int' nicht möglich

    Was soll das denn heißen, wie kommt er auf int?

    Dachte schon man könnte es auch folgendermaßen machen:

    char text[2000]; //warum darf ich die Eckigen Klammern nicht leer lassen?
    
    printf("\n Geben Sie Ihren Text ein:\n);
    		scanf("%c",&text);
    		fprintf(datei,text);
    

    Ich dachte, wenn man die eckigen Klammern leer lässt, sucht C sich allein die Mindestgröße.

    Ich hoffe man kann mir hier helfen, falls ich mir lieber ein anderes Forum für N00b-Fragen suchen sollte sagt es mir bitte gleich.

    Aber eine Frage habe ich noch am Rande, ich verwende 'Visual C++ 2008 Express Edition' wie kann ich es einstellen, dass er bei C/C++ spezifischen Wörtern einen Highlight anwendet?

    Ich danke schon mal im Voraus! Hoffe jemand kann mir meine Fehler zeigen, damit ich auch mit FILEs arbeiten kann.



  • Zitat:
    error C2664: 'putc': Konvertierung des Parameters 1 von 'FILE *' in 'int' nicht möglich

    Was soll das denn heißen, wie kommt er auf int?

    Er komtm auf int, weil er da auch ein int haben will.

    http://www.cplusplus.com/reference/clibrary/cstdio/putc.html



  • Also getchar() ist ein 'int', da 'zeichen' aber ein 'char' ist gibt es Probleme habe ich das richtig verstanden?
    Kann ich mir gar nicht vorstellen, getchar muss doch vom Typ char sein!
    Also muss eine Konvertierung statt finden?

    Im Quellcode wird folgendes gezeigt:

    char zeichen = int getchar(void) != char abbruch
    
    while((zeichen = getchar()) != abbruch) {
    			putc(zeichen,datei);
    
    		}
    

    Also muss eine Konvertierung statt finden?
    Zudem habe ich die Reihenfolge im putc verdreht gehabt. Warum wird hier erst die Eingabe genannt und dann die Datei? Bei fprintf und fscanf ist es ja genau anders rum. :p

    Mein anderer Versuch geht gar nicht:

    #include "stdafx.h"
    #include <conio.h>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	FILE *datei;
    	char text[254];
    
    	printf("Text in Datei eingeben\n");
    
    	datei = fopen("test.txt","w+");
    
    	if(datei == NULL) {
    		printf("Datei konnte nicht geöffnet werden.");
    	} else {
    
    		printf("\n Geben Sie Ihren Text ein:\n ");
    		scanf("%c",&text);
    		fprintf(datei,text);
    
    		fclose(datei);
    		printf("Text wurde in die Datei geschrieben");
    		printf("\n\nIhr Text (string): %s",text);
    		printf("\n\nIhr Text (char): %c",text);
    
    	}
    

    So sieht es auf dem Bildschirm aus:

    Text in Datei eingeben
    
     Geben Sie Ihren Text ein:
     Testtext
    Text wurde in die Datei geschrieben
    
    Ihr Text (string): T╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠H
    ¶1►╠╠╠╠Øzé«© ↕
    
    Ihr Text (char): 0
    

    So wie der String sieht es auch in der test.txt aus?


  • Mod

    1. getchar liefert auch EOF! Muss also ein int sein
    2. scanf("%c" ! Wie wäre es mal wenn Du die scanf Doku bemühst... 😉



  • Ich dachte bei C gibt es keine Strings.
    Na toll, klar mit

    scanf("%s",&text);
    

    geht es natürlich, aber nicht perfekt. Sobald ein Leerzeichen eingegeben wird ist schluss. Ich kann keine Sätze abspeichern?
    Mit einem Zeiger habe ich es auch nicht hinbekommen?
    Toll, warum wird immer mit Char gearbeitet?

    Warum gibt es dann nicht auch einen Datentyp STRING?

    Gibt es eine Möglichkeit, ein Char zu deklarieren ohne schon vorher die Größe fest zu definieren?

    Also statt:

    char text[254];
    

    irgendwie sowas:

    char text[];
    char text;
    string text;
    

    Habe mich entschieden für USER-Eingaben gets(text); zu werden, um 'Strings' aus der Datei auszulesen nehm ich fscanf(datei,text);
    Ist das der richtige Ansatz?



  • Es gibt den Datentyp "string" nicht, aber Zeichenketten sehr wohl.
    Ein

    char *cString;
    

    kann ein Zeiger auf eine Zeichenkette sein und ist somit eine char Zeichenkette ohne feste Größe. Siehe http://de.wikibooks.org/wiki/C-Programmierung:_Arrays_und_Strings#Strings
    Du must dich vielleicht noch etwas mehr mit den Grundlagen beschäftigen, weil die wird dir hier niemand ausführlich erklären.



  • Mit einem Zeiger hatte ich es schon probiert, da ich weiß das die Länge nicht definiert werden muss, ist ja in der Adresse mit enthalten.

    ABER:

    char *text;
    
    scanf("%c",&text);
    // oder auch:
    scanf("%s",&text);    
    fprintf(datei,text);
    

    Erstmal wird nur quatsch eingelesen und es kann nicht in eine Datei geschrieben werden. Muss ich die Zeigeradresse erst wieder in eine Variable umwandeln, wenn ja muss ich den Sinn von Zeigern noch einmal studieren.



  • Ja das geht so nicht, weil scanf die Adresse der Variablen haben will. Und da deine "text" Variable nur ein Zeiger ist und keinen Speicher für mehrere Zeichen reserviert hat, funktioniert das nicht. Wenn du also Beispielsweise 10 Zeichen einlesen willst, musst du

    char text[10];
    

    nehmen.



  • Genau da liegt mein Problem ich weiß nicht wie viele Zeichen es werden, ich will aber auch nicht zu viel Speicher reservieren. Ich glaube ich bleibe erstmal bei get()
    DANKE euch allen 👍



  • Also wenn du nicht gerade einen µController o.ä. programmierst, solltest du kein Problem bekommen wenn du mal 1024 character sprich 1024 Bytes reservierst. 1kB ist nichts...


Anmelden zum Antworten