Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Zusammenarbeit Excel - C

Empfohlene Antworten

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
  • Ansichten 9k
  • Erstellt
  • Letzte Antwort
  • Autor

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

  • Autor

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:

  • Autor

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?

Vermutlich ist das Working Directory ein anderes Verzeichnis.

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.
  • Autor

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

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.

  • Autor

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?

  • Autor

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?

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.