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

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.

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

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

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


#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

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

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

  • Autor

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

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.

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

            }

  • Autor

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?

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.

  • 1 Monat später...
  • Autor

Hallo Leute,

sorry, dass ich mich jetzt erst wieder melde, aber ich war noch in einem anderen Projekt eingebunden, welches dringend fertig werden musste.

@ TDM

eine propertyVariable ist doch eine öffentliche Variable in C, oder?

  • Autor

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

  • Autor

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.

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.