Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

  • Antworten 63
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Geschrieben (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 von Alex_winf01
Geschrieben

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?:rolleyes:

Geschrieben

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?

Geschrieben

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.
Geschrieben

@ 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?

Geschrieben

Das gleiche gilt für diesen Kommentar:

// Hier dann in einer switch-case-Anweisung in die Datei schreiben

Ich 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.

Geschrieben

Natürlich weiss ich, dass die Kommentare nichts bewirken.:rolleyes:

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?

Geschrieben

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?

Geschrieben
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. ;)

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...