fopen() datei nicht erstellt



  • Hallo,

    ich verstehe nicht was ich falsch mache, aber fopen() erstellt mir keine Datei mit dem jeweiligen Text drin.

    Ich kriege immer die Warnung: Falsch formatierter universeller Zeichenname im Pfad bei "Users". Aber auch wenn ich den Pfad ändere, finde ich keine Datei.

    int main(){
    	// --- File erzeugen --
    	FILE *log;
    	if( (log = fopen("C:\Users\XXX\Desktop\Testfile.txt","w")) == NULL){
    		cout << "Fehler " << GetLastError() << endl;
    	}
    	// --- Pufferung ausschalten --
    	setvbuf(log,NULL,_IONBF,0);
    	// --- etwas schreiben --
    	fprintf(log,"Testzeile");
    	// --- File schliessen --
    	fclose(log);
    	getchar();
    	return 0;
    }
    


  • Das ist übrigens C, nicht C++.
    Den Grund sieht man bereits in der Färbung des Stringliterals. Ein \ hat dort eine besondere Bedeutung, evtl. nachfolgende Zeichen bedeuten was anderes (wie bei \n, \t,...). Einfach / als Trenner verwenden oder \.



  • Das ist C, kein C++. Und \ leitet eine Escape-Sequenz ein. Nimm / oder \.



  • Und so schreibt man es kürzer... 😃



  • Das ist C++, kein C. C kennt weder cout noch endl.



  • OH, stimmt ja. 😮



  • Vielen Dank, habe mich schon gewundert warum der Code im Forum blau hervorgehoben wird.

    Ich wollte jetzt die Textzeile auslesen und ausgeben, aber er gibt mir komische Zeichen aus. Ich habe den String dann nullterminiert aber das funktioniert auch nicht.

    int main(){
    	// --- File erzeugen--------------------------------------
    	FILE *log;
    	char ausgabe[100+1];
    	if( (log = fopen("C:/Users/XXX/Desktop/Testfile.txt","w")) == NULL){
    		cout << "Fehler " << GetLastError() << endl;
    	}
    	// --- Pufferung ausschalten-------------------------------
    	setvbuf(log,NULL,_IONBF,0);
    	// --- etwas schreiben -------------------------------------
    	fprintf(log,"Testzeile");
    	fseek(log,0,SEEK_END);//pointer auf anfang
    
    	//Lesen und Ausgabe des Textes
    	fscanf (log, "%d", &ausgabe);
    
    	ausgabe[100] = '\0';
    	printf ("%s\n", ausgabe);
    	// --- File schliessen--------------------------------------
    	fclose(log);
    	getchar();
    	return 0;
    }
    


  • Das kann nur schiefgehen:

    fscanf (log, "%d", &ausgabe);
    

    Liest einen Integer - in Form eines Strings - aus der Datei und packt ihn binär(!) in ein char array - als 4 char. (Vorausgesetzt int ist 32 Bit)

    printf ("%s\n", ausgabe);
    

    Gibt diese Zeichen dann aus - die anderen 96 Zeichen sind zufällig, da wird nichts sinnvolles stehen 😉



  • Du öffnest das Logfile, im Write-Modus; Inhalt wird komplett gelöscht.
    Anschließend schreibst du da etwas hinein.
    Dann versuchst du einen int auszulesen. Im Write-Modus geht das nciht, außerdem exisitiert kein int in der Datei!
    Die komischen Zeichen, sind die die zufälligerweise an der Speicheradresse standen, wo du dein char abgelegt hast.
    Und was zur Hölle willst du mit FILE?
    Nutze i/ofstream der C++ Standardbibliothek!



  • wenn du schreiben und lesen willst musst du Datei entsprechend öffnen
    ich denke "w+" ist hier das richtige
    für das einlesen einer zeile verwendest du am besten fgets
    warum deaktivierst du die pufferung

    warum benutzt du nicht die C++ iostream sachen die sind komfortabler



  • Das funktioniert trotzdem nicht. Wie kann ich lesen bis zu "/0" und dann ausgeben? Ich glaub das ist weil er den ganzen Char mit 100bytes ausgibt. Hier noch mal der Code:

    int main(){
    	// --- File erzeugen--------------------------------------
    	FILE *log;
    	char ausgabe[100+1];
    	if( (log = fopen("C:/Users/XXX/Desktop/Testfile.txt","w+")) == NULL){
    		cout << "Fehler " << GetLastError() << endl;
    	}
    	// --- Pufferung ausschalten-------------------------------
    	setvbuf(log,NULL,_IONBF,0);
    	// --- etwas schreiben -------------------------------------
    	fprintf(log,"%s","Testzeile"); //%8d %8d %8d %8d",156,2233,1267,67);
    	fseek(log,0,SEEK_END);//pointer auf anfang
    
    	//Lesen und Ausgabe des Textes
    	fgets(ausgabe, 0, log);
    
    	ausgabe[100] = '\0';
    	printf ("%s\n", ausgabe);
    	// --- File schliessen--------------------------------------
    	fclose(log);
    	getchar();
    	return 0;
    }
    

    Pufferung benutze ich nicht, weil ich mit Log-dateien arbeite.



  • http://man.cx/?page=fgets&do[go]=go lesen nicht überfliegen
    "/0" wiso du schreibst das doch nirgendwo in die Datei
    falls du '\0' meinst dann gilt das gleiche

    ausgabe[100] = '\0';
    

    ist überflüssig
    warum testest du in Zeile 5 auf den fehler wenn du ihn sowiso nicht vernünftig behandelst



  • Der Inhalt deines Files wird mit fprinft() überschrieben!
    Danach gibts da ncihts mehr, was gelesen werden kann!



  • Nathan schreibe kein quatsch
    so hier ein kleines C (!= C++) Programm

    #include <stdlib.h>
    #include <stdio.h>
    int main(void)
    {
    	char line [101];
    	//öffnet die datei zum lesen und schreiben oder erstellt eine neue
    	//falls Datei vorhanden dann wird inhalt der datei gelöscht
    	FILE *log = fopen("log", "w+");
    	if(log == NULL) {
    		perror("openfile: log");
    		return EXIT_FAILURE;
    	}
    	//deaktiviere Pufferung
    	setbuf(log, NULL);
    	//schreibt Test in die Datei
    	fputs("Test", log);
    	//setze position in Datei auf Anfang
    	rewind(log);
    	//liest inhalt der Datei bis EOF oder \n
    	fgets(line, sizeof(line), log);
    	//gibt inhalt von line und \n aus
    	puts(line);
    
    	fclose(log);
    	return EXIT_SUCCESS;
    }
    


  • Ah sorry, mein Fehler.
    Ich dachte der hätte da noch

    //Lesen und Ausgabe des Textes
    fscanf (log, "%d", &ausgabe);
    

    wie am Anfang stehen.



  • Erst nochmal vielen Dank für die Hilfe, aber ich habe den Fehler letzendlich entdeckt. Die zufälligen Zeichen wurden dadurch erzeugt das ich den Pointer die ganze Zeit aufs Ende(fseek(log,NULL,SEEK_END);) gesetzt habe und dann natürlich nur quatsch ausgelesen habe. Richtig wäre gewesen *fseek(log,NULL,SEEK_SET);
    *

    int main(){
    	// --- File erzeugen--------------------------------------
    	FILE *log;
    	char ausgabe[100];
    	if( (log = fopen("C:/Users/Deniz/Desktop/Testfile.txt","w+")) == NULL){
    		cout << "Fehler " << GetLastError() << endl;
    	}
    	// --- Pufferung ausschalten-------------------------------
    	setvbuf(log,NULL,_IONBF,0);
    	// --- etwas schreiben -------------------------------------
    	fprintf(log,"%s","Testzeile");//fputs("Testzeile",log);
    	fseek(log,NULL,SEEK_SET);//rewind(log);//pointer auf anfang
    
    	//Lesen und Ausgabe des Textes
    	fgets(ausgabe, sizeof(ausgabe), log);
    	printf ("%s\n", ausgabe); //puts(ausgabe);
    	// --- File schliessen--------------------------------------
    	fclose(log);
    	getchar();
    	return 0;
    


  • Trotzdem: Schaue dir die C++ fstreams an. Die sind viel einfacher und intuitiver.
    Wie cout/cin können sie verwendet werden.


Log in to reply