Klotzkopp Geschrieben 20. Juli 2008 Geschrieben 20. Juli 2008 Was soll das sein? C oder C++? Die Dateiendung und der Code selbst deuten auf C hin, diese Includedirektiven sind aber C++-spezifisch. Dass ein C-Compiler die nicht findet, dürfte nicht weiter verwunderlich sein. Du benutzt auch nichts, das einen dieser Header erfordern würde. Außerdem empfehle ich dir, bei der "Fehlerbehandlung" etwas mehr zu tun als nur einen Kommentar hinzuschreiben, damit man auch merkt, wenn ein Fehler aufgetreten ist. Zitieren
Alex_winf01 Geschrieben 20. Juli 2008 Autor Geschrieben 20. Juli 2008 (bearbeitet) Es handelt sich um C und ich möchte gerne aus Dateien einlesen und wieder reinschreiben. Dafür brauche ich die entsprechenden includes. Lasse ich die includes weg, ist die erzeugte Datei natürlich leer (siehe meinen Beitrag oben). Kann die leere erzeugte Datei auch andere Gründe haben? Bearbeitet 20. Juli 2008 von Alex_winf01 Zitieren
Alex_winf01 Geschrieben 20. Juli 2008 Autor Geschrieben 20. Juli 2008 Also habe jetzt folgenden Code: #include <stdio.h> #include <stdlib.h> int main(void) { FILE *datei = fopen("Kat_A2_5.csv", "r"); FILE *datei_neu = fopen("Kat_A2_5_MAS_ueberarbeitet.csv", "w+"); if (datei != NULL) { char line [128]; while (fgets(line, sizeof line, datei)) { line[strlen(line)-1] = '\0'; if(strcmp("text1", line) == 0) continue; else if(strcmp("text2", line) == 0) continue; else if(strcmp("text3", line) == 0) continue; else { fputs(line, datei_neu); fputs(";", datei_neu); fputs("2008;", datei_neu); fputs("false;", datei_neu); fputs("true;", datei_neu); fputs("false;", datei_neu); fputs("\n", datei_neu); } } fclose(datei); fclose(datei_neu); } else { // Fehlerbehandlung } return 0; } Jetzt wird die Datei erzeugt - ist aber leer. Kann mir da noch jemand bei helfen? Zitieren
Alex_winf01 Geschrieben 20. Juli 2008 Autor Geschrieben 20. Juli 2008 Also das Programm läuft in den else-Zweig rein: else { printf("Datei kann nicht geöffnet werden"); system("Pause"); } Die zu öffnende Datei heisst tatsächlich Kat_A2_5.csv und liegt im selben Verzeichnis wie das C-Programm.:confused: Was habe ich übersehen? Zitieren
Alex_winf01 Geschrieben 20. Juli 2008 Autor Geschrieben 20. Juli 2008 Hat jemand einen Tipp? Zitieren
Bubble Geschrieben 21. Juli 2008 Geschrieben 21. Juli 2008 Vermutlich ist das Working Directory ein anderes Verzeichnis. Zitieren
Alex_winf01 Geschrieben 21. Juli 2008 Autor Geschrieben 21. Juli 2008 @ Bubble und wie wird das Working Directory gesetzt? Komisch, das normale HelloWorld.c funzt aus dem selben Verzeichnis ohne Probleme. Zitieren
Klotzkopp Geschrieben 21. Juli 2008 Geschrieben 21. Juli 2008 Benutz einen absoluten Pfad beim Öffnen, um zu prüfen, ob es am Arbeitsverzeichnis liegt. FILE *datei = fopen("C:\\Pfad\\zur\\Dateo\\Kat_A2_5.csv", "r"); Bist du sicher, dass die Datei nicht gerade noch von einem anderen Prozess benutzt wird? Lasse ich die includes weg, ist die erzeugte Datei natürlich leer (siehe meinen Beitrag oben).Und lässt du die Includedirektiven drin, lässt es sich erst gar nicht kompilieren. Daraus solltest du nun wirklich nicht folgern, dass du diese Direktiven brauchst. Nochmal: Das sind Includedirektiven für C++-Header. Damit kann dein C-Compiler nichts anfangen, und du brauchst sie auch nicht. Zitieren
Alex_winf01 Geschrieben 25. Juli 2008 Autor Geschrieben 25. Juli 2008 @ Klotzkopp Das Problem habe ich gelöst. Folgende "Problemchen" habe ich jetzt noch 1.) Jetzt erzeugt er die Date - schreibt aber nur die erste Zeile in die Datei. 2.) Ich habe ja geschrieben, dass bei text1 die Dateiausgabe wie folgt aussehen muss: fputs(line, datei_neu); fputs(";", datei_neu); fputs("2008;", datei_neu); fputs("false;", datei_neu); fputs("true;", datei_neu); fputs("false;", datei_neu); fputs("\n", datei_neu); Bei text2 muss die Dateiausgabe wie folgt aussehen: fputs(line, datei_neu); fputs(";", datei_neu); fputs("2008;", datei_neu); fputs("true;", datei_neu); fputs("false;", datei_neu); fputs("false;", datei_neu); fputs("\n", datei_neu); Und bei text3 muss die Dateiausgabe wie folgt aussehen: fputs(line, datei_neu); fputs(";", datei_neu); fputs("2008;", datei_neu); fputs("false;", datei_neu); fputs("false;", datei_neu); fputs("true;", datei_neu); fputs("\n", datei_neu); Ändere ich den Code wie folgt: int main(void) { FILE *datei = fopen("Kat_A2_5.csv", "r"); FILE *datei_neu = fopen("Kat_A2_5_MAS_ueberarbeitet.csv", "w+"); int was; if (datei != NULL) { char line [128]; while (fgets(line, sizeof line, datei)) { line[strlen(line)-1] = '\0'; if(strcmp("text1", line) == 0) { was = 1; continue; } else if(strcmp("text2", line) == 0) { was = 2; continue; } else if(strcmp("text3", line) == 0) { was = 3; continue; } else { // Hier dann in einer switch-case-Anweisung in die Datei schreiben fputs(line, datei_neu); fputs(";", datei_neu); fputs("2008;", datei_neu); fputs("false;", datei_neu); fputs("true;", datei_neu); fputs("false;", datei_neu); fputs("\n", datei_neu); } } fclose(datei); fclose(datei_neu); } else { // Fehlerbehandlung } return 0; } Ich glaube, ich habe da einen Denkfehler. Leider funzt das so nicht. Könnt ihr mir noch mal helfen? Zitieren
SoL_Psycho Geschrieben 25. Juli 2008 Geschrieben 25. Juli 2008 Ich helf dir erstmal, indem ich, wie oben schon jemand anders, nochmal darauf hinweise, dass Fehlerbehandlung mehr, als einen Kommentar beinhalten sollte Zitieren
Klotzkopp Geschrieben 25. Juli 2008 Geschrieben 25. Juli 2008 Das gleiche gilt für diesen Kommentar: // Hier dann in einer switch-case-Anweisung in die Datei schreibenIch hoffe, du glaubst nicht, dass diese Kommentare etwas bewirken. Du musst das schon umsetzen, was da steht. Stammen diese Kommentare eigentlich von dir selbst? Es wäre übrigens auch recht sinnvoll zu prüfen, ob das zweite fopen geklappt hat. Du prüfst nur das Ergebnis des ersten, und machst im Fehlerfall - wie bereits mehrfach erwähnt - nichts. Zitieren
Alex_winf01 Geschrieben 25. Juli 2008 Autor Geschrieben 25. Juli 2008 Natürlich weiss ich, dass die Kommentare nichts bewirken. Also, das zweite fopen funktioniert - es wird die erste Zeile in die Datei geschrieben. Anschließend steht nichts mehr in der Datei. Ich habe jetzt die switch-case-Anweisung eingebaut, genauso wie die Fehlerbehandlung. Während der Laufzeit, läuft er nicht in die Fehlerbehandlung rein. Wo habe ich da den Denkfehler? Zitieren
Alex_winf01 Geschrieben 25. Juli 2008 Autor Geschrieben 25. Juli 2008 Mein Code sieht so aus: #include <stdio.h> int main(void) { FILE *datei = fopen("C:\\Dokumente und Einstellungen\\Alexandra\\Eigene Dateien\\oracle\\Kat_A2_5.csv", "r"); FILE *datei_neu = fopen("Kat_A2_5_MAS_ueberarbeitet.csv", "w+"); int was; if(datei_neu == NULL) { printf("Fehler"); } if (datei != NULL) { char line [128]; while (fgets(line, sizeof line, datei)) { line[strlen(line)-1] = '\0'; if(strcmp("Zusatzentgelte - Arzneimittel", line) == 0) { was = 1; continue; } else if(strcmp("Zusatzentgelte - Medikalprodukte", line) == 0) { was = 2; continue; } else if(strcmp("Zusatzentgelte - Nicht-Medikalprodukt", line) == 0) { was = 3; continue; } else { switch(was) { case 1: fputs(line, datei_neu); fputs(";", datei_neu); fputs("2008;", datei_neu); fputs("true;", datei_neu); fputs("false;", datei_neu); fputs("false;", datei_neu); fputs("\n", datei_neu); case 2: fputs(line, datei_neu); fputs(";", datei_neu); fputs("2008;", datei_neu); fputs("false;", datei_neu); fputs("true;", datei_neu); fputs("false;", datei_neu); fputs("\n", datei_neu); case 3: fputs(line, datei_neu); fputs(";", datei_neu); fputs("2008;", datei_neu); fputs("false;", datei_neu); fputs("false;", datei_neu); fputs("true;", datei_neu); fputs("\n", datei_neu); } } fclose(datei); fclose(datei_neu); } } else { printf("Fehler"); } return 0; } Und bevor ihr mich prügelt, JA ICH WEISS, DASS PRINTF FÜR EINE FEHLERBEHANDLUNG NICHT AUSREICHT. Es soll nur zu Testzwecken anzeigen, OB ÜBERHAUPT EIN FEHLER AUFTRITT!!!!!! Die Ausgabe in der Datei: ZE13;2008;true;false;false; ze13;2008;false;true;false ze13;2008;false;false;false Die dreifache Ausgabe der ersten Zeile kann man begegnen, in dem man in den Case-Zweig noch ein break einbaut. Aber: warum ließt er nur die erste Zeile und dann nichts mehr? Zitieren
Klotzkopp Geschrieben 25. Juli 2008 Geschrieben 25. Juli 2008 JA ICH WEISS, DASS PRINTF FÜR EINE FEHLERBEHANDLUNG NICHT AUSREICHT. Es soll nur zu Testzwecken anzeigen, OB ÜBERHAUPT EIN FEHLER AUFTRITT!!!!!!Ganz ruhig Ein printf ist schon viel, viel besser als ein Kommentar, und kann durchaus eine ausreichende Fehlerbehandlung sein. Alles in Ordnung. Aber: warum ließt er nur die erste Zeile und dann nichts mehr?Schau dir mal genau an, wann du die Dateien schließt. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.