Zum Inhalt springen

Zusammenarbeit Excel - C


Alex_winf01

Empfohlene Beiträge

Das sollte dir doch schon seltsam vorkommen.

Die Ursache ist, dass fgets, wenn es das Einlesen wegen eines Zeilenumbruchs abbrícht, den Zeilenumbruch mit in den String packt. In line steht also nicht "text", sondern vermutlich "text\n".

Ich empfehle, das letzte Zeichen von line abzuschneiden, wenn es ein Zeilenumbruch ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Antworten 63
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

OK und wie schneide ich das letzte Zeichen ab?
Hast du überhaupt versucht, das selbst herauszufinden?

line(strlen(line)-1)='\0';

Ich empfehle dir übrigens, ein Grundlagentutorial oder -buch durchzuarbeiten, wenn du mit deinem Programm fertig bist.

Und: wie löse ich am geschicktesten das andere Problem? Meine erste Zeile in der Ausgabedatei sieht ja nicht so aus wie sie soll.
Das ist kein anderes Problem, das ist dasselbe Problem. fgets liest eben nicht "AAA", sondern "AAA\n". Und genau das gibst du im Moment auch noch aus. Also landet der Rest in der nächsten Zeile. Bearbeitet von Klotzkopp
Link zu diesem Kommentar
Auf anderen Seiten teilen

blödes, dämliches VC7 hat nichtmal strlen...

Nuja, trotzdem scheints so zu gehen:


void toStrCsv(char * dest, const char * src)

{

	int i = 0;

	do 

	{

		dest[i] = '\0';

	} while (++i < sizeof(dest));

	i = 0;

	do

	{

		if (src[i]!=0x0A)

			dest[i] = src[i];

	} while (++i < sizeof(src));

	dest[i] = '\0';

}



int main(int argc, char* argv[])

{

	/*COleDateTime t(1970,1,1,14,0,0);

	srand((int) t);

	int mod = 36;

	for(int i = 0; i <= t.GetHour(); i++)

	{

		cout << rand()%mod << endl;

	}

	cin.get();*/


	FILE *datei = fopen("file1.csv", "r");

    FILE *datei_neu = fopen("file2.csv", "w+");


    if (datei != NULL)

    {

        char line [128];

		char* buffer = (char*) malloc(sizeof(char) * sizeof(line));

        do

        {

			if(fgets(line, sizeof(line), datei))

			{

				toStrCsv(buffer, line);

				if(strcmp("text", buffer) == 0)

				{

					continue;

				}

				else

				{

					fputs(buffer, datei_neu);

					fputs("2008;", datei_neu);

					fputs("true;", datei_neu);

					fputs("false;", datei_neu);

					fputs("false;", datei_neu);

					fputs("\n", datei_neu);

				}

			}

        } while (!feof(datei));

		free(buffer);

		buffer = NULL;

        fclose(datei);

        fclose(datei_neu);

    }

    else

    {

        // Fehlerbehandlung

    }

	return 0;

}

btw: dass kein ';' nach buffer kommt, ist gewollt, oder?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die kommt auch nicht mit rein.

text

abc

def

ghi

jkl

abc2008;true;false;false;

def2008;true;false;false;

ghi2008;true;false;false;

jkl2008;true;false;false;

Edit:

Wie bitte? Natürlich hat es das.

Der findet bei mir kein strlen. (string.h ist geincludet)

sizeof(dest) == sizeof(char*) == 4 (auf 32-Bit-Systemen). Ist das beabsichtigt?

Hab mich schon gewundert, warum das immer 4 ist. :rolleyes:

Natürlich nicht beabsichtigt.

Bearbeitet von TDM
Link zu diesem Kommentar
Auf anderen Seiten teilen


#define SIZEOF(x) (sizeof(x)/sizeof(x[0]))

void toStrCsv(char * dest, const char src[])

{

	int i = 0;

	do 

	{

		dest[i] = '\0';

	} while (++i <= SIZEOF(dest));

	i = 0;

	do

	{

		if (src[i]!=0x0A)

			dest[i] = src[i];

	} while (++i < SIZEOF(src));

	dest[i] = '\0';

}

besser?

Edit: strlen ist doch da, nur in der Überwachungskonsole mag er's irgendwie nicht.

Bearbeitet von TDM
Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst nicht die Größe eines Funktionsparameter-Arrays bestimmen. Diese Information geht beim Funktionsaufruf verloren.

Wieder was gelernt. :)


void toStrCsv(char * dest, const int lenDest, const char src[], const int lenSrc)

{

	int i = 0;

	do 

	{

		dest[i] = '\0';

	} while (++i < lenDest);

	i = 0;

	do

	{

		if (src[i]==0x00) break;

		if (src[i]!=0x0A)

			dest[i] = src[i];

	} while (++i < lenSrc);

	dest[i-1] = '\0';

}


Aufruf in Main:


toStrCsv(buffer, SIZEOF(buffer), line, SIZEOF(line));

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du versuchst eine gewisse line()-Funktion aufzurufen, die gibt es nicht wenn Du sie nicht selbst geschrieben hast ;).

Ich denke Du willst auf die letzte Stelle deines char-Arrays zugreifen. Das geht mit eckigen Klammern:

line[strlen(line)-1] = '\0';

Das hier ist allerdings eine Zuweisung. Wenn du eine Abfrage starten willst, brauchst du "==".

Link zu diesem Kommentar
Auf anderen Seiten teilen

#include <stdio.h>

#include <iostream>

#include <fstream>

#include <cstring>


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

            {

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

            }

            if(strcmp("text2", line) == 0)

            {

                continue;

            }

            else

            {

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

            }

            if(strcmp("text3", line) == 0)

            {

                continue;

            }

            else

            {

                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

    {

        // Fehlerbehandlung

    }


    return 0;

}

Jetzt sollen ja die Überschriften (text1, text2, text3) nicht mit in die Datei. Bei text1 funktioniert es auch, aber bei text2 wird folgendes in die Datei geschrieben: text2;2008;true;false;false.

Bei text3 sieht es genauso aus. Da steht dann drinn: text3;2008;false;false;true.

Wie kann ich das unterdrücken?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schau dir doch mal an, was dein Code macht:

Wenn da "text1" steht, nimm die nächste Zeile

Ansonsten gib den Text aus.

Wenn da "text2" steht, nimm die nächste Zeile

Ansonsten gib den Text aus.

Wenn da "text3" steht, nimm die nächste Zeile

Ansonsten gib den Text aus.

Wenn da also text2 steht, wird trotzdem einmal ausgegeben, weil ja die erste Bedingung nicht zutrifft.

Wenn da weder text1, noch text2 oder text3 steht, wird sogar dreimal in die Ausgabedatei geschrieben. Ist dir das gar nicht aufgefallen?

Es ist Quatsch, den Ausgabecode dreimal zu verwenden. Außerdem darfst du erst dann ausgeben, wenn alle Filterabfragen abgearbeitet wurden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es ist Quatsch, den Ausgabecode dreimal zu verwenden. Außerdem darfst du erst dann ausgeben, wenn alle Filterabfragen abgearbeitet wurden.

Es ist allgemein Quatsch dreimal das gleiche zu schreiben (sicher copy&paste?!).

Lieber dann so:


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

            }

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank schon mal für die Antworten. Ich glaube, das ganze ist etwas missverständlich rübergekommen. Also:

von text1 an soll in der Datei stehen:

1. die Zeile;

2. 2008;

3. false;

4. true;

5. false

Ab text2 soll dann in der Datei stehen:

1. die Zeile;

2. 2008;

3. true;

4. false;

5. false

Ab text3 soll dann in der Datei stehen:

1. die Zeile;

2. 2008;

3. false;

4. false;

5. true

Dabei sollen die Überschriften wo text1, text2, text3 drinnsteht nicht mit in die neue Datei. Könnt ihr mir da helfen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das trivialste wäre, bei einer Übersicht einfach eine propertyVariable zu setzen und dann zur nächsten Zeile zuspringen.

Beim schreiben in die Datei überprüfst du dann diese variable mittels select-case und schreibst die werte so rein, wie sie drin stehen sollen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Monat später...

#include <stdio.h>

#include <iostream>

#include <fstream>

#include <cstring>


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 ist die Datei leer. Wie kann das sein?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bekomme jetzt folgende Fehlermeldung:

Warning: Can't read file's timestam:

c:\Dokumente und Einstellungen\Alexandra\Eigene Dateien\oracle\main.c

Linkinc console executable: bin\Debug\oracle.exe

mingw32-g++ exe: obj\Debug\main.o: No such file or directory.

Woran kann das liegen? Bitte helft mir. Ist dringend.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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