voldemort Geschrieben 30. Mai 2010 Geschrieben 30. Mai 2010 hallo zusammen. ziel der aufgabe steht ja im titel. ich habe also angefangen ersteinmal ohne malloc zu programmieren. mein erstes ziel ist die erfolgreiche ausgabe einer ausgelesenen datei mit fscanf. in der test text datei steht 5555;552 es sollen natürlich nur die zahlen ausgelesen werden. hier mein bisheriger code: static int i[6000]; int zeichen,anzahl=0; FILE*datei = fopen (/*argv[1]*/ "c:\\test.txt","r"); if (datei == NULL) { printf("Error"); } do { zeichen = fscanf(datei,"%d",&i); if (zeichen == 1) { anzahl++; } else { fseek(datei,1L,SEEK_CUR); } printf("%d ",i); }while(!feof(datei)); fclose(datei); ich habe da anscheinend großen mist gebaut. wer kann mir helfen, oder verbessern? mfg voldemort Zitieren
voldemort Geschrieben 30. Mai 2010 Autor Geschrieben 30. Mai 2010 ok. ich habe meinen fehler so weit schonmal gefunden. ich habe irgendwie schon probiert malloc einzubauen, obwohl ich es ja erstmal nicht wollte :old die ausgabe ist nun da, jedoch wiederholt sich die letzte zahl nochmals und ich komme nicht drauf warum int i; int zeichen,anzahl=0; FILE*datei = fopen ("c:\\test.txt","r"); if (datei == NULL) { printf("Error"); } do { zeichen = fscanf(datei,"%d",&i); if (zeichen == 1) { fseek (datei, 1, SEEK_CUR); } printf("%d ",i); }while(!feof(datei)); fclose(datei); Zitieren
Klotzkopp Geschrieben 30. Mai 2010 Geschrieben 30. Mai 2010 Du solltest die Ausgabe nur machen, wenn fscanf erfolgreich war. Zitieren
voldemort Geschrieben 30. Mai 2010 Autor Geschrieben 30. Mai 2010 (bearbeitet) hab natürlich währendessen mal weiter gemacht und es auch so weit geschafft das nun keine fehlermeldung mehr erscheint. mit meiner testdatei funktioniert das ganze auch noch. int i,k,l,tmp; int zeichen,anzahl=0,zahl=0,*speicher; FILE*datei = fopen (/*argv[1]*/ "c:\\zahlen.csv" ,"r"); if (datei == NULL) { printf("Error"); } do { zeichen = fscanf(datei,"%d",&i); if (zeichen == 1) { fseek (datei, 1, SEEK_CUR); anzahl++; } }while(!feof(datei)); speicher = (int*) malloc (anzahl * sizeof (int) ); fseek (datei, 0L, SEEK_SET); do { zeichen = fscanf(datei,"%d",&i); if (zeichen == 1) { fseek (datei, 1, SEEK_CUR); speicher[zahl]=i; zahl++; } }while(!feof(datei)); fclose(datei); for (k = 0; k < anzahl; k++) { for (l = 1+k; l < anzahl; l++) { if (speicher [k] > speicher [l]) { tmp = speicher [l]; speicher [l] = speicher [k]; speicher [k] = tmp; } } } for (l = 0; l < anzahl; l++) { printf ("%d \n", speicher[l]); } wenn ich nun aber eine datei nehme welche die zahlen von 1 bis 9999 durcheinander geworfen hat öffnet sich zwar das ausgabefenster, aber das einizige was man sieht ist der cursor. habe ich da irgendwo einen fehler? Bearbeitet 30. Mai 2010 von voldemort Zitieren
Klotzkopp Geschrieben 30. Mai 2010 Geschrieben 30. Mai 2010 Überleg dir nochmal, wann du ein Zeichen überspringen solltest. Und den Rückgabewert von malloc soll man nicht casten. Zitieren
voldemort Geschrieben 30. Mai 2010 Autor Geschrieben 30. Mai 2010 (bearbeitet) kannst du da evtl noch konkreter drauf eingehen? was meinst du mit casten? der ausdruck ist mir leider nicht geläufig. --------------------------------------------------- edit: casten in sinne von typecase? haben wir aber so gelernt.warum sollte man denn nicht umwandeln? Bearbeitet 30. Mai 2010 von voldemort Zitieren
Klotzkopp Geschrieben 30. Mai 2010 Geschrieben 30. Mai 2010 kannst du da evtl noch konkreter drauf eingehen?Schau dir doch genau an, was du tust: Wenn du erfolgreich einliest, überspringst du ein Zeichen und machst weiter. Wenn das Einlesen aber fehlschlägt, versuchst du es an derselben Stelle nochmal. Kann ja nicht gehen. was meinst du mit casten? der ausdruck ist mir leider nicht geläufig.Ein Cast ist eine explizite Typumwandlung. Wie hier: speicher = (int*) malloc (anzahl * sizeof (int) ); Das (int*) ist hier überflüssig und kann unter bestimmten Umständen Fehler verbergen. Zitieren
voldemort Geschrieben 30. Mai 2010 Autor Geschrieben 30. Mai 2010 dann versteh ich aber nicht warum das programm mit meiner testdatei funktioniert. ich habe nun auch versucht ein bisschen zu tüfteln und hab mir auch explizit die schleifen und abfragen angeschaut. wenn ich nun den schritt weiter vor die abfrage stelle funktioniert das ganze programm nicht mir. ist zwar nicht meine art, aber könntest du denn bitte mal den code korregieren? nun möchte ich echt wissen woran es genau liegt. meistens ist es ja nur ne kleinigkeit Zitieren
Klotzkopp Geschrieben 30. Mai 2010 Geschrieben 30. Mai 2010 dann versteh ich aber nicht warum das programm mit meiner testdatei funktioniert.Vermutlich, weil deine Testdatei einen anderen Aufbau hat. Zeig doch mal die erste Zeile dieser Datei. wenn ich nun den schritt weiter vor die abfrage stelle funktioniert das ganze programm nicht mir.Welchen Schritt vor welche Abfrage? Zitieren
voldemort Geschrieben 30. Mai 2010 Autor Geschrieben 30. Mai 2010 (bearbeitet) schritt weiter = fseek ; also gehe ein zeichen weiter in der testdatei steht 5555;552 die große datei ist genau so aufgebaut nur das sie aus den zahlen 1 - 9999 besteht. das semikolon ist natürlich hier das trennzeichen. hab nun auch mal die erste zeile aus der großen datei in meine testdatei kopiert und siehe, wird auch gelesen und sortiert hab nun die abfragen in so weit geändert das wenn zeichen=1 nur anzahl++ ansonsten fseek. auf deutsch, nur ein zeichen weiter gehen wenn ein anderes zeichen als eine zahl gelesen wird. ich denke mal das du das gemeint hast, aber ändert leider immer noch nichts am problem Bearbeitet 30. Mai 2010 von voldemort Zitieren
Klotzkopp Geschrieben 30. Mai 2010 Geschrieben 30. Mai 2010 hab nun auch mal die erste zeile aus der großen datei in meine testdatei kopiert und siehe, wird auch gelesen und sortiertDas heißt, die große Datei hat mehrere Zeilen, und deine Testdatei nur eine? Dann ist der Aufbau wohl doch nicht gleich. Zitieren
voldemort Geschrieben 30. Mai 2010 Autor Geschrieben 30. Mai 2010 (bearbeitet) durch kopieren der zeile hab ich zwei zeilen um genau zu sein jetzt seh ich wo das problem ist. am ende der datei steht ;; nun versteh ich das aber nicht mehr da ich doch durch fseek ein zeichen weiter gehe wenn es keine zahl ist,oder? Bearbeitet 30. Mai 2010 von voldemort Zitieren
voldemort Geschrieben 30. Mai 2010 Autor Geschrieben 30. Mai 2010 (bearbeitet) so statt den fseek befehl verwende ich nun auf tipp eines kollegen weiter = fgetc (datei); aber es muss doch auch mit fseek möglich sein,oder? hier der jetzige code int i,k,l=0,tmp; int zeichen,anzahl=0,zahl=0,*speicher; char weiter; FILE*datei = fopen (/*argv[1]*/ "c:\\zahlen.csv" ,"r"); if (datei == NULL) { printf("Error"); } do { zeichen = fscanf(datei,"%d",&i); weiter = fgetc (datei); if (zeichen == 1) { anzahl++; } }while(!feof(datei)); speicher = (int*) malloc (anzahl * sizeof (int) ); fseek (datei, 0L, SEEK_SET); do { zeichen = fscanf(datei,"%d",&i); weiter = fgetc (datei); speicher[zahl]=i; zahl++; }while(!feof(datei)); fclose(datei); for (k = 0; k < anzahl; k++) { for (zahl = 1+k; zahl < anzahl; zahl++) { if (speicher [k] > speicher [zahl]) { tmp = speicher [k]; speicher [k] = speicher [zahl]; speicher [zahl] = tmp; } } } for (k = 0; k < anzahl; k++) { printf ("%d \n", speicher[k]); } Bearbeitet 30. Mai 2010 von voldemort Zitieren
Klotzkopp Geschrieben 30. Mai 2010 Geschrieben 30. Mai 2010 fseek funktioniert bei Textdateien unter Windows nicht richtig, weil da eine Umforumung der Zeilenumbrüche stattfinden kann. Wahrscheinlich liegt's daran. Zitieren
voldemort Geschrieben 31. Mai 2010 Autor Geschrieben 31. Mai 2010 gibt es denn da nicht eine saubere lösung als die meine um das zu umgehen? Zitieren
TDM Geschrieben 1. Juni 2010 Geschrieben 1. Juni 2010 Warum nicht den ganzen Text einlesen und dann nach ';' bzw. '\n' splitten? Dann die einzelnen Zahlenstrings mittels atoi versuchen umzuwandeln. Zitieren
voldemort Geschrieben 1. Juni 2010 Autor Geschrieben 1. Juni 2010 also du meinst einmal einlesen, dann nach semikolon und zeilenumbruch abfragen und erst dann ein zeichen weitergehen. bis dahin verstanden, aber die funktion atoi ist mit unbekannt. kann leider nicht etwas einbauen was wir noch nicht durchgenommen haben. 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.