Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 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. Zitieren
Alex_winf01 Geschrieben 13. Juni 2008 Autor Geschrieben 13. Juni 2008 OK und wie schneide ich das letzte Zeichen ab? Und: wie löse ich am geschicktesten das andere Problem? Meine erste Zeile in der Ausgabedatei sieht ja nicht so aus wie sie soll. Zitieren
Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 (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 13. Juni 2008 von Klotzkopp Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 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?! Zitieren
Alex_winf01 Geschrieben 13. Juni 2008 Autor Geschrieben 13. Juni 2008 @ TDM Ja, so funktioniert es. Nur: Die Zeile mit dem text sieht jetzt so aus: text2008;true;false;false Diese Zeile soll ja nicht mit in die neue Datei. Zitieren
Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 blödes, dämliches VC7 hat nichtmal strlen...Wie bitte? Natürlich hat es das. } while (++i < sizeof(dest));sizeof(dest) == sizeof(char*) == 4 (auf 32-Bit-Systemen). Ist das beabsichtigt? Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 (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. Natürlich nicht beabsichtigt. Bearbeitet 13. Juni 2008 von TDM Zitieren
Alex_winf01 Geschrieben 13. Juni 2008 Autor Geschrieben 13. Juni 2008 @ Klotzkopp bei mir findet der auch kein strlen. Wie würdest Du das machen? Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 (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 13. Juni 2008 von TDM Zitieren
Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 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. Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 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)); Zitieren
Alex_winf01 Geschrieben 13. Juni 2008 Autor Geschrieben 13. Juni 2008 @ Klotzkopp wie hättest Du das gemacht? Bei mir kennt der kein strlen. Zitieren
Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Bei mir kennt der kein strlen. Das ist keine ausreichende Fehlerbeschreibung. Zeig den Code und die dazugehörige Fehlermeldung. Zitieren
Alex_winf01 Geschrieben 14. Juni 2008 Autor Geschrieben 14. Juni 2008 line(strlen(line)-1)='\0'; führt zu folgende Fehlermeldung: 'line' cannot be used as a function Zitieren
InfoJunkie Geschrieben 14. Juni 2008 Geschrieben 14. Juni 2008 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 "==". Zitieren
Klotzkopp Geschrieben 14. Juni 2008 Geschrieben 14. Juni 2008 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: Zitieren
Alex_winf01 Geschrieben 18. Juni 2008 Autor Geschrieben 18. Juni 2008 #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? Zitieren
Klotzkopp Geschrieben 18. Juni 2008 Geschrieben 18. Juni 2008 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. Zitieren
TDM Geschrieben 18. Juni 2008 Geschrieben 18. Juni 2008 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); } Zitieren
Alex_winf01 Geschrieben 18. Juni 2008 Autor Geschrieben 18. Juni 2008 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? Zitieren
TDM Geschrieben 18. Juni 2008 Geschrieben 18. Juni 2008 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. Zitieren
Alex_winf01 Geschrieben 20. Juli 2008 Autor Geschrieben 20. Juli 2008 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? Zitieren
Alex_winf01 Geschrieben 20. Juli 2008 Autor Geschrieben 20. Juli 2008 #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? Zitieren
Alex_winf01 Geschrieben 20. Juli 2008 Autor Geschrieben 20. Juli 2008 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. Zitieren
Alex_winf01 Geschrieben 20. Juli 2008 Autor Geschrieben 20. Juli 2008 Kann mir keiner helfen? Der Compiler kann die folgende includes nicht finden: #include <iostream> #include <fstream> Zitieren
Empfohlene Beiträge
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.