unerwarteter Eintrag in CSV-Datei
-
Hallo,
ich schreibe zyclisch in eine CSV-Datei ("pfad und Dateiname.csv"). Damit andere Programme nicht beim schreiben der Datei, diese öffnen, erzeuge ich eine "dateiname.logged" Datei. Diese lösche ich nach dem schreiben wieder.
Seit ich diesen Programmcode habe steht am Ende der CSV-Datei das Wort "logged" und ich weiß nicht woher das kommt. Wenn ich den neuen Code (erzeugen/löschen "dateiname.logged") herausnehme, tritt das Problem nicht auf. Es kommt eindeutig von hier.
Anbei mein Code.int schreibe_file(char *filename) { int fp; char buffer[256]; char filebuffer[8000]; int i=0; char logname[256]; filebuffer[0] = '\0'; for (i=0; i < anzzeile; i++) { sprintf(buffer, "%s;%0d;%-25s;%d\n", paramzeile[i].anlage, paramzeile[i].mpi, paramzeile[i].varname, paramzeile[i].wert); strcat(filebuffer, buffer); } strncpy(logname,filename,strlen(filename)-3); strcat(logname, "logged"); fp = open(logname,O_RDONLY | O_CREAT | O_TRUNC | S_IRUSR | S_IRGRP); close(fp); if ((fp = open(filename, O_WRONLY | O_TRUNC | O_NONBLOCK | O_SYNC )) == -1) { /* ERROR */ ; meldung("CSV-Datei konnte zum schreiben nicht geoeffnet werden"); exit (-1); } else { write(fp , filebuffer, strlen(filebuffer)); close(fp); } remove(logname); return 0; }Danke
worst_case
-
Ist filebuffer groß genug?
Warum überhaupt der zusätzliche Puffer? Warum schreibst du nicht einfach Zeile für Zeile in die Datei, nachdem du alle Prüfungen gemacht hast?
-
Hallo,
meine Daten haben ca. 3,3 kB. (Speicher 8000 Byte)
Wenn ich Zeile für Zeile schreibe blockiere ich ja die Datei länger als nötig,
des weiteren schreibt "write" daten mit bis zu 4kB ohne Unterbrechung.
Also die Daten auf einen Rutsch zu schreiben ist doch wesentlich effektiver als Zeile für Zeile.Noch eine Ergänzung: Ich habe "logged" gegen "Hans" getauscht und siehe da jetzt wird Hans in die Datei am Ende geschrieben.
Es liegt also hier in diesem Code.Danke
-
Welchen Wert hat anzzeile?
Welchen Wert hat i am Ende der Funktion?
-
Hallo,
beide Zähler liegen bei 89.
Was auch richtig ist.Ich habe nun die deklaration geändert, und es funktioniert. Kein fehlerhafter Eintrag mehr in meine CSV-Datei
Ich habe mein Programm nun mehrere Tage am laufen, und soweit so gut.int fp; char buffer[256]={}; char logname[256]={}; char filebuffer[8000]={}; int i=0;Warum, das weiß ich auch nicht. Ich habe nur die Zeilen getauscht und den Speicher lasse ich jedesmal löschen, obwohl nicht benötigt !!!
Trotzdem muss ich den Fehler erklären können, da vermutlich der Fehler noch vorhanden ist, ich Ihn aber nicht mehr sehe.(Speicherleck oder schreiben auf nicht zugewiesenen Speicher).Gruß
-
strncpy schreibt keine abschließende null, wenn es über die länge geht. Mit {} wird der buffer vorher komplett mit null initialisierst.
-
Hallo,
DrGreenthumb schrieb:
strncpy schreibt keine abschließende null, wenn es über die länge geht. Mit {} wird der buffer vorher komplett mit null initialisierst.
strncpy(logname,filename,strlen(filename)-3);d.h ich müsste mehr als 256 Zeichen als Pfad und Dateiname haben ?
Ich habe aber unter 100 Zeichen.Wenn du das damit gemeint hast ?
Gruß
-
strncpy ist einfach eine total kaputte Funktion (selbst für C Standard Library Verhältnisse). Lass am besten die Finger davon!
size_t const n = strlen(filename) - 3; assert(n < sizeof(logname)); memcpy(logname, filename, n); logname[n] = 0;
-
worst_case schrieb:
DrGreenthumb schrieb:
strncpy schreibt keine abschließende null, wenn es über die länge geht. Mit {} wird der buffer vorher komplett mit null initialisierst.
strncpy(logname,filename,strlen(filename)-3);d.h ich müsste mehr als 256 Zeichen als Pfad und Dateiname haben ?
Ich habe aber unter 100 Zeichen.Wenn du das damit gemeint hast ?
nein, ich habe gemeint, bei dem strncpy-Aufruf wird keine NULL an das Ende von logname geschrieben und dementsprechend schreibt das folgende strcat ins Nirvana.
-
Hi,
irgendwie sitze ich auf der Leitung.
char *strncpy(char *kett1, const char*kett2, sitze_t nBeschreibung......
..... Wenn die Länge von kett2 kleiner als n Zeichen ist, dann wird in der Zeichenkette kett1 für die fehlenden Zeichen \0 angehängt.
....Vorsicht: wenn die Zeichenkette kett2 länger als n Zeichen ist, wird kein \0 angehängt.strncpy(logname,filename,strlen(filename)-3);Nach dieser Beschreibung und meinem Code sollte sein....
strlen(filename)-3 < länge logname -> muss funktionieren da \0 eingetragen. (Dies ist bei mir der Fall)
strlen(filename)-3 > länge logname -> wird kein \0 angehängt... ist auch irgendwie klar.
Hab ich das richtig verstanden ??

Danke für die Geduld
-
dein kett2 ist filename und nicht logname!
Aber wie ich bereits sagte: strncpy ist einfach nur kaputt. Es macht immer zu viele oder zu wenig 0en.