voldemort Geschrieben 21. März 2010 Teilen Geschrieben 21. März 2010 hallo, ich bin etwas länger auf der suche nach einem fehler in meinem programm. das programm soll entweder per drag and drop, oder per pfad eingabe ausgeführt werden. es soll mit 16 byte(=1block) gelesen werden. int menge; int groesse = 16; int block = 1; char puffer; char pfad[100]; if (argc != 1) { FILE*datei = fopen (argv[1],"r"); if (datei == NULL) { printf("Error"); } } else { printf("Bitte geben Sie den Pfad an\n\n"); gets(pfad); FILE*datei = fopen (pfad,"r b"); if (datei == NULL) { printf("Error"); } do { menge = fread (&puffer,groesse,block,datei); if (menge != 16) { break; } printf("%c",puffer); }while (true); fclose(datei); } return 0; } vielleicht kann mir jemand helfen und sagen wo mein fehler ist, oder evtl sind. grüße Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. März 2010 Teilen Geschrieben 21. März 2010 Wenn du fread sagst, dass du einen 16 Byte großen Puffer hast, dann aber nur einen 1 Byte großen Puffer übergibst, kann das nicht funktionieren. Was willst du denn mit den ausgelesenen Daten machen? Auslesen zum Selbstzweck ist ja mehr oder weniger sinnlos. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
voldemort Geschrieben 21. März 2010 Autor Teilen Geschrieben 21. März 2010 ich übergebe doch mit groesse meine 16 byte und das einmal mit block =1. versteh ich nun hier etwas falsch? es handelt sich hier um eine aufgabe aus der schule die besagt das die ausgabe auf dem bildschirm zu sehen sein soll. grüße Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. März 2010 Teilen Geschrieben 21. März 2010 Deine Puffer-Variable ist nur 1 char groß, das ist 1 Byte. Mehr passt da nicht rein. Wenn du 16 Bytes einlesen willst, solltest du ein Array von 16 char anlegen und benutzen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 21. März 2010 Teilen Geschrieben 21. März 2010 (bearbeitet) int groesse = 16; char puffer; //reserviert genau 1 char (=1Byte) an Puffer &puffer //Cave: Bereichsüberschreitung! versuchs mal mit char *puffer; [...] puffer = (char*)malloc(siezeof(char)*groesse)); Dann klappt's auch mit dem Nachbarn;) Bearbeitet 21. März 2010 von lilith2k3 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. März 2010 Teilen Geschrieben 21. März 2010 versuchs mal mit char *puffer; [...] puffer = (char*)malloc(siezeof(char)*groesse));[/CODE] Den Rückgabewert von malloc soll man nicht casten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 21. März 2010 Teilen Geschrieben 21. März 2010 Äh, ja schlechte Angewohnheit *g* Gelobe Besserung! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 22. März 2010 Teilen Geschrieben 22. März 2010 Warum überhaupt malloc? char puffer[groesse]; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
voldemort Geschrieben 23. März 2010 Autor Teilen Geschrieben 23. März 2010 wenn ich sage char puffer[16] meckert zwar der compiler nicht mehr, aber ich bekomm auch keine ausgabe auf dem bildschirm. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. März 2010 Teilen Geschrieben 23. März 2010 wenn ich sage char puffer[16] meckert zwar der compiler nicht mehr, aber ich bekomm auch keine ausgabe auf dem bildschirm. Hast du denn die Ausgabe auch dementsprechend geändert? Du musst jetzt 16 Einzelzeichen ausgeben, nicht mehr nur 1. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
voldemort Geschrieben 23. März 2010 Autor Teilen Geschrieben 23. März 2010 ok. so weit so gut. int menge,i; int groesse = 16; int block = 1; char puffer[16]; char pfad[100]; if (argc != 1) { FILE*datei = fopen (argv[1],"r"); if (datei == NULL) { printf("Error"); } } else { printf("Bitte geben Sie den Pfad an\n\n"); gets(pfad); FILE*datei = fopen (pfad,"r b"); if (datei == NULL) { printf("Error"); } do { menge = fread (&puffer,groesse,block,datei); if (menge != 1) { break; } for (i=0;i<15;i++) { printf("%c",puffer[i]); } }while (true); printf("\n"); fclose(datei); } return 0; } jetzt hab ich das problem das meine auszulesende datei mittendrin abgebrochen wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 24. März 2010 Teilen Geschrieben 24. März 2010 if (menge != 1)Warum brichst du ab, wenn dir ein Lesevorgang, der 16 Bytes lesen soll, nicht genau 1 Byte liefert? Menge sollte doch üblicherweise 16 sein, am Ende der Datei vermutlich weniger. Du kannst nicht davon ausgehen, dass fread dir die vollen 16 Bytes liefert. Das ist aber kein Grund zum Abbrechen. Statt dessen musst du das in der Ausgabeschleife berücksichtigen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 24. März 2010 Teilen Geschrieben 24. März 2010 Warum überhaupt malloc? char puffer[groesse]; Nicht zwingend notwendig. Dynamisch halt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 24. März 2010 Teilen Geschrieben 24. März 2010 if (menge != 1)Warum brichst du ab, wenn dir ein Lesevorgang, der 16 Bytes lesen soll, nicht genau 1 Byte liefert? Nachtrag: Mein Fehler, das ist natürlich Blödsinn. fread gibt nicht die Anzahl der Bytes zurück. Insofern passt 1. Wie groß ist die Datei denn? Und an welcher Stelle wird abgebrochen? Ist das überhaupt eine Textdatei? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 24. März 2010 Teilen Geschrieben 24. März 2010 Nicht zwingend notwendig. Dynamisch halt Ein VLA ist genauso dynamisch wie ein mit malloc reserviertes Array. Malloc ist aber intern viel aufwändiger, und man darf das free nicht vergessen. Allerdings unterstützen nicht alle Compiler VLAs. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
voldemort Geschrieben 5. April 2010 Autor Teilen Geschrieben 5. April 2010 sorry, war im urlaub. es handelt sich hier um eine reine txt datei und aus einem mir nicht erklärlichen grund bricht das programm immer an der gleichen stelle ab. in so fern sieht es noch nicht mal nach abbrechen aus, sondern das programm gibt an das es hier fertig ist. grüße Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 6. April 2010 Teilen Geschrieben 6. April 2010 es handelt sich hier um eine reine txt datei und aus einem mir nicht erklärlichen grund bricht das programm immer an der gleichen stelle ab.An welcher Stelle genau passiert es denn? Was steht an dieser Stelle in der Datei? Wie groß ist die Datei genau? An gafsa_lagare: Dein Thread ist hier. Bitte nicht einfach fremde Threads kapern. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
voldemort Geschrieben 6. April 2010 Autor Teilen Geschrieben 6. April 2010 an der stelle steht ein : oder ein leerzeichen. das ist natürlich nun schwer zu sagen da das programm denkt es sei hier fertig. die datei ist nur 4KB groß. es handelt sich um eine ipconfig. grüße Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 6. April 2010 Teilen Geschrieben 6. April 2010 an der stelle steht ein : oder ein leerzeichen. das ist natürlich nun schwer zu sagen da das programm denkt es sei hier fertig.Du könntest die einzelnen menge-Werte aufsummieren, dann wüsstest du es genau. Dann könntest du mit einem Hex-Editor prüfen, was genau an dieser Stelle in der Datei steht. die datei ist nur 4KB groß.Ich hatte ausdrücklich nach der genauen Größe gefragt . Wenn es geht, in Bytes. Du könntest die Datei auch zippen und hier anhängen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
voldemort Geschrieben 7. April 2010 Autor Teilen Geschrieben 7. April 2010 oh sorry. die datei ist natürlich 3.764 Bytes groß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.