13. Juni 200817 j 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.
13. Juni 200817 j Autor 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.
13. Juni 200817 j 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 200817 j von Klotzkopp
13. Juni 200817 j 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?!
13. Juni 200817 j Autor @ 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.
13. Juni 200817 j 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?
13. Juni 200817 j 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 200817 j von TDM
13. Juni 200817 j #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 200817 j von TDM
13. Juni 200817 j 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.
13. Juni 200817 j 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));
13. Juni 200817 j Bei mir kennt der kein strlen. Das ist keine ausreichende Fehlerbeschreibung. Zeig den Code und die dazugehörige Fehlermeldung.
14. Juni 200817 j Autor line(strlen(line)-1)='\0'; führt zu folgende Fehlermeldung: 'line' cannot be used as a function
14. Juni 200817 j 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 "==".
14. Juni 200817 j 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:
18. Juni 200817 j 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?
18. Juni 200817 j 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.
18. Juni 200817 j 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); }
18. Juni 200817 j 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?
18. Juni 200817 j 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.
20. Juli 200817 j 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?
20. Juli 200817 j 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?
20. Juli 200817 j 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.
20. Juli 200817 j Autor Kann mir keiner helfen? Der Compiler kann die folgende includes nicht finden: #include <iostream> #include <fstream>
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.