Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Geschrieben (bearbeitet)
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
Geschrieben

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

Geschrieben (bearbeitet)

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
Geschrieben (bearbeitet)


#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
Geschrieben
besser?
Nein, immer noch 4. Du teilst jetzt nur sizeof(char*) durch sizeof(char), was per Definition 1 ist.

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

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

Geschrieben

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

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

Wie InfoJunkie bereits erkannt hat, müssen da eckige Klammern hin. Die Zuweisung ist hier beabsichtigt.

Ich frage mich nur, wie man von dieser Fehlermeldung auf die Diagnose "der kennt kein strlen" kommt. :confused:

Geschrieben

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

Geschrieben

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.

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

            }

Geschrieben

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?

Geschrieben

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

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?

Geschrieben

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

Geschrieben

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.

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