Aus Datei lesen
-
Gewöhnt euch doch mal daran, dass ihr in C für euch problematische Funktionalitäten kapseln könnt, solche 'Auslagerungen' nennt man auch 'Funktionen'.
Schon mal gehört das Wort?
Beim Design der Funktion muss man sich Gedanken über die Schnittstelle machen, d.h. welche Parameter gehen rein, welche gehen raus.Hier mal beispielhaft, ungetestet und ohne Fehlerbehandlung als Funktion 'konvertiere':
unsigned short konvertiere(unsigned short pixel) { /* hier ist die eigentliche Aufgabenstellung ausgelagert worden, d.h. hier wurde Datei/Speicher/... usw. Randproblematiken weggekapselt und ihr könnt euch auf das eigentlich Problem konzentrieren */ pixel = pixel - 1024; /* oder was auch immer ihr hier machen wollt/sollt */ ... return pixel; } int main () { FILE *f=fopen("bla.ima","r+b"); /* Lesen und Schreiben binär, evtl. noch auf unsigned short Alignment achten! (was das ist -- fragt euren Lehrer) */ long lSize,x,y; unsigned char *puffer; unsigned short *p,(*pixel)[512]; /* Zeiger auf 'eine' 512er-Pixelzeile */ fseek(f , 0L , SEEK_END); lSize = ftell(f); rewind(f); p = puffer = malloc(lSize); /* GANZE Datei einlesen in Pufferbereich */ if( !fread(puffer,lSize,1,f) ) exit(1); /* suchen nach den 'magischen' Headerinfos und Zeiger auf Position 'dahinter' setzen */ while( p[0]!=0x7FE0 && p[1]!=0x0010 ) ++p; /* p steht jetzt auf den 'magischen' Werten, jetzt noch Position 'dahinter' setzen */ p+=2; /* jetzt steht der Zeiger p auf dem Beginn der Pixelmatrix und es kann losgehen */ pixel=p; /* anonymen unsigned char/unsigned short Speicherbereich vorbereiten für 'pixelmatrix'-Durchlauf */ /* hier einfach 512x512 pixelweise durchlaufen */ for(y=0;y<512;++y) for(x=0;x<512;++x) pixel[x][y]=konvertiere(pixel[x][y]); /* und jeweils eine evtl. Konvertierung machen und konvertierten oder nicht konvertierten Wert immer zurückschreiben an originale Position */ rewind(f); /* <-- vro Zurückschreiben des Dateiinhaltes muss der Deskriptor wieder an den Anfang */ if( !fwrite(puffer,lSize,1,f) ) exit(1); /* ganzen Speicherbereich INKL. der evtl. konvertierten Pixel wieder zurückschreiben */ fclose(f); free(puffer); return 0; }
-
Hey,
danke!
Ich werde das mal alles aufholen und nochmal von Grund auf neu lernen!
Ich hab viele große Lücken aber muss nun am Ball bleiben!
Danke nochmal für eure Hilfe. Ich werde sicher in Zukunft noch oft hier fragen
Ich werde mir dann aber auch gleich die bessere Struktur und einen guten Coding Style aneignen.
lg Zermy
-
Eine doofe Frage habe ich aber noch:
Wie mache ich das, dass ich es hinbekomme mit sscanf und sprintf einen Dateinamen einzulesen und diesen dann mit einem Anhang auszugeben.
Egal welche Datei es sein soll.
zB.:
Eingabe:
Leber.imaAusgabe:
Leber_bearbeitet.imabei mir kommen immer sone Scherze wie Leber.ima_bearbeitet oder so raus.
lg Zermy und schonmal ein schönes Wochenende!!!
-
Ein
sscanf(Dateiname, "%[^.]%s", filename, extension);
geht bei einfachen Dateinamen, scheitert aber bei relativen Angaben ("../Datei.ext")Da musst du wohl mit den Funktionen aus string.h rumspielen. z.B
strrchr(Dateiname, '.')
Dann hast du die Position vom . (wenn er vorhanden ist) und er muss rechts vom '\' bzw '/' sein.
-
Moin, kurze Frage, ich denke das die anderen hier auch in dem selben Studiengang sind, denn sonst hätten wir alle nicht die gleiche Aufgabe
Naja ich habe es noch etwas anders gelöst.... Jetzt habe ich den Witz im PC Pool vor Ort ging es, zu Hause jetzt nicht. Besonders fällt mir auf, in der Aufgabenstellung heißt es man öffnet die Datei "Kopf.IMA" und möchte als "Kopf_seg.IMA" speichern und wenn ich das eingebe dann kommt stack corrupt output Fehler, aber wenn ich alles andere eingebe klappt es. Ich habe fast das Gefühl es liegt am Unterstrich, weil K.IMA macht er ohne Probleme aber auch da hapert es irgendwie, denn wenn ich es im Programm angucke ist nicht alles draußen was sein sollte
#include <stdio.h> #include <string.h> void main() { short vector[2]={0}; short bild[512][512]; int count = 0, i, x = 0, y = 0; char input[10], output[10], eingabe[100]="C:\\PRP2\\", ausgabe[100]="C:\\PRP2\\"; FILE *fp; printf("\n\nBitte geben Sie den Namen der Input-Datei ein! "); scanf("%s", &input); strcat(eingabe,input); // Eingabe ist der Pfad mit cat wird input hinten rangehangen printf("%s\n\n", eingabe); printf("\n\nBitte geben Sie den Namen der Output-Datei ein! "); scanf("%s", &output); while (strcmp(input,output) == 0) // Wird verglichen, damit nicht zwei Mal gleicher Name entsteht also Datei überschreibt { printf("\n\nDie Output-Datei darf nicht den gleichen Namen haben wie die Input-Datei! "); scanf("%s", output); } strcat(ausgabe,output); printf("%s\n\n", ausgabe); fp = fopen(eingabe, "rb"); if(fp == NULL) { printf("File does not exist"); } else { //printf("\n\nCT Reader\n"); while(!(vector[0]==0x7FE0&&vector[1]==0x0010)) // wichtig sind ja nur folgende Strings nach den gesucht werden muss { fread(vector, sizeof(short),2, fp); } if(vector[0]==0x7FE0&&vector[1]==0x0010) { fseek(fp, 4*sizeof(char)+sizeof(long), SEEK_CUR); fread(bild, sizeof(short),512*512, fp); for(x=0;x<512;x++) // Short Matrix des Bildes wird eingelesen und die Punkte auf schwarz gesetzt { for(y=0;y<512;y++) { if(bild[x][y]==124 || bild[x][y]==1274) bild[x][y] = 0; } } fclose(fp); fp = fopen(ausgabe, "wb"); // neue Datei wird geöffnet (falls nicht vorhanden neu angelegt) fwrite(bild, sizeof(short),512*512, fp); fclose(fp); } } }
Warum jetzt output rumpöbelt und habe ich irgendwo noch was vergessen z.B. in der for Schleife weil wie gesagt irgendwie nicht alles "unnötige" auf schwarz gesetzt wird...
-
Aus wie vielen Zeichen besteht "Kopf_seg.IMA"
Und wo willst du diesen Namen speichern?
Wie viel Platz hast du dafür vorgesehen?Mach beim nächsten mal einen neuen Thread auf. Dieser ist seit zwei Jahren tot.
-
saschokkk schrieb:
...weil wie gesagt irgendwie nicht alles "unnötige" auf schwarz gesetzt wird...
Wie stellst du das fest?
Wie lautet die Aufgabe?
-
b) Bei jedem Punkt im Bild überlegen Sie sich, ob Sie den Bildwert lassen,
oder ob Sie ihn auf Null setzen, da er Luft oder Knochen entspricht.In dieser Aufgabe soll das Kopfbild bearbeitet werden, das im Verlauf einer
Schlaganfalldiagnose entstanden ist. Wie Sie sehen, gibt es auf dem Bild relativ
viel Luft (= alles, was einen CT-Wert kleiner als -900 HU hat) und
relativ viel Schädelknochen (= alles, was einen CT-Wert größer als 250 HU
hat). Weder die Luft noch der Schädelknochen sind in diesem Fall von Interesse,
so dass wir diese Daten auf -1024 HU setzen, also auf 0 im Datensatz,
so dass wirklich nur noch das Gehirngewebe angezeigt wird, das weiterverarbeitet
werden konnte.Deswegen meine For Schleife zum Einlesen der Matrix und danach die If Bedingung zum 0 setzen der Pixel, die eben außerhalb des "erlaubten" HU Bereichs sind.
Edit: Und hast natürlich Recht die Arrays müssen vergrößert werden
Aber sogar wenn die jetzt groß genug sind für Input und Output ist trotzdem Output corrupt...
-
saschokkk schrieb:
Aber sogar wenn die jetzt groß genug sind für Input und Output ist trotzdem Output corrupt...
Was meinst du damit? Die Arrays mit den Namen (input und output)? Die Dateien, deren Namen in den Arrays stehen?
Du setzt nur in zwei Fällen die Punkte auf 0. Dann wenn sie genau den Grenzwerten entsprechen.
In der Aufgabe stand sogar etwas von kleiner und größer.Beim Schreiben des Bildes hast du auch keine Headerinformationen mehr.
Ach und bei der Eingabe von Strings kommt in desn seltensten Fällen der Adressoperator zum Einsatz.
(Das & in Zeile 20 und 15 ist zuviel)
-
HAHAHAHAHAHA na klar es muss ja <124 und >1274 sein oh man ey
Danke für den Fehler!! Das habe ich jetzt korrigiert und es wird genau das ausgeblendet was ich wollte
Auch das mit dem Output ist jetzt geklärt, also vorher hatte ich so verstanden dass ja das Output Char Array mit 10 viel zu klein war, jetzt wo das & weg ist meckert er gar nicht mehr
Alles einwandfrei!! Danke schön
Und zum Thema Header dass ist nicht schlimm sagte der Prof. Denn das Programm zum Öffnen der Bilder kann auch mit den Rohbildern umgehen
-
saschokkk schrieb:
Danke für den Fehler!!
Ne, lass mal. Den hast du ganz alleine gemacht.
saschokkk schrieb:
Auch das mit dem Output ist jetzt geklärt, also vorher hatte ich so verstanden dass ja das Output Char Array mit 10 viel zu klein war,
So war das auch gemeint. 10 Zeichen sind für "Kopf_seg.IMA" zu wenig (12 übrigens auch).
An solchen Stellen musst du nicht sparsam sein (es sei denn du hast viele Dateinamen).
-
Ja wie gesagt insgesamt habe ich dieselben Aufgaben wie die Herren vor mir, Aufgabe 2 mit der Filterung also Mittelung der Nachbarszellen habe ich gelöst. Werde wohl morgen das mit dem Zoom machen wo dann aus einem 512x512 ein 256x256 Bild wird, falls da noch Schwierigkeiten geben wird schreibe ich noch mal
Ich hatte nur auf das Datum (also Tag/Monat geachtet) nicht auf das Jahr und deswegen dachte ich wow 14.04 das ist ja höchst aktuell und meins darunter geposted
-
Ich glaube die Aufgabe recht schnell gelöst zu haben
Ich poste es troztdem hier noch mal damit eventuell @DirkB noch mal dir anguckst und auch sozusagen der vollständigkeitshalber falls jemand Probleme hat und durch Googlen diesen Thread findet
Die letzte Aufgabe lautet: Man hat ein Herzbild, das Herz an sich ist aber viel zu klein geworden (ist nur in der Mitte) und man möchte es näher betrachten können, deswegen sollen nur die mittleren Pixel vom Bild genommen werden, also soll ein 256x256 Bild daraus werden.
Dann habe ich mir so eine Schleife gebastelt und bin recht zufrieden mit dem Bild was raus kommt.
for(x=0;x<256;x++) { for(y=0;y<256;y++) { bildneu[x][y] = bild[x+128][y+128]; } }