Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  Aus Datei lesen  
Gehen Sie zu Seite 1, 2, 3, 4, 5, 6, 7, 8, 9  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
basti273
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
Beitrag basti273 Mitglied 22:28:02 02.04.2012   Titel:   Aus Datei lesen            Zitieren

Hey Leute,
ich habe eine Aufgabe, an der ich schon stundenlang sitze , aber keinen Schritt weiterkomme.

Prinzip ist grob, dass wir eine DICOM-Datei vorgegeben haben und aus der sollen wir alle Bildpunkte auslesen und dann bestimmte Punkte ändern, sodass sich dann letztendlich die Farben im Bild ändern.

Mein Problem ist allerdings, dass ich nicht genau weiß wie ich die Bildpunkte auslese, da ich keinerlei Informationen darüber vorgegeben habe, nur dass die Bildpunkte nach der hexadezimale Zahlenkombination (0x7FE0,0x0010), und dann noch 4 char variablen überspringen, anfangen.
An die Stelle soll ich wohl mit fseek springen und dann anfangen die Bildpunkte eines 512x512 großen Bildes auszulesen.

Hab leider gar keinen Ansatz.
Letztens hatte ich ähnliches, aber mit vorgegebenem header-Dateien und hier weiß ich gar nicht wie und woraus ich irgendwie lesen soll.

Gruß,
basti
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5613
Beitrag dot Mitglied 22:31:40 02.04.2012   Titel:              Zitieren

Ich würd mal sagen: Das hier wär wohl ein guter Anfang.

_________________
one point of view will never reveal the entire scene.
basti273
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
Beitrag basti273 Mitglied 22:49:08 02.04.2012   Titel:              Zitieren

könnte man dann mit:

fseek(pFile,(short)132*sizeof(char),0);

an den Anfang der Bildpunkte springen?

Wenn ja, wie liest man dann die Punkte aus?


Zuletzt bearbeitet von basti273 am 23:05:56 02.04.2012, insgesamt 1-mal bearbeitet
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 08:04:21 03.04.2012   Titel:              Zitieren

basti273 schrieb:
könnte man dann mit:

fseek(pFile,(short)132*sizeof(char),0);

an den Anfang der Bildpunkte springen?

Das (short) ist überflüssig, sizeof(char) ist per default 1.
Und für die 0 gibt es das Makro SEEK_SET

Die Kennung ab Position 128 solltest du zur Sicherheit auch mit einlesen.
Dann weißt du, dass dein Format richtig ist.

basti273 schrieb:
Wenn ja, wie liest man dann die Punkte aus?

Wie ist denn das Format von den Daten, hast du da schon was rausgefunden?

Binärdaten kanns tu mit fread oder fgetc lesen.
Du musst aber auf die Bytereihenfolge achten.
basti273
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
Beitrag basti273 Mitglied 08:20:21 03.04.2012   Titel:              Zitieren

Bin jetzt mit folgendem an den ersten Bildpunkt gesprungen.

C++:
    fseek(pFile, 128*sizeof(char), SEEK_SET);
    fseek(pFile, 4*sizeof(char), SEEK_CUR);


Ja, als Tipp wurde vorgegeben, die Bildpunkte als short auslesen zu lassen.
Dann soll man jeden einzelnen Punkt auslesen im Wert ändern.
Aber das auslesen klappt nicht.

bei fread fehlt mir auch irgendwie immer was...
Weiß da nicht so recht, wie ich da rauslesen soll, da ich iwie keine bestimmte adresse habe.


Zuletzt bearbeitet von basti273 am 08:24:44 03.04.2012, insgesamt 2-mal bearbeitet
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 08:28:50 03.04.2012   Titel:              Zitieren

Dann zeig mal etwas mehr Code.

Auf welchem System und mit welchem Compiler arbeitest du?

Das auslesen als short soll vermutlich ein 16-Bit-Integer (2 Byte) bedeuten.
Was sagt denn die Dokumentation zur Bytereihenfolge?
basti273
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
Beitrag basti273 Mitglied 08:34:49 03.04.2012   Titel:              Zitieren

Ich arbeite mit Microsoft Visual Studio.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>

#define SIZE 50

 
int main(void)
{
    FILE *pFile;
    char filename[SIZE];
 
    printf("Welche Datei wollen sie oeffnen: ");
    scanf("%s", &filename);
 
    pFile = fopen(filename,"rb");
    if(pFile)
    {
        printf("Datei wurde geoeffnet!\n");
        fclose(pFile);
    }
    else
    {
        printf("Datei konnte nicht gefunden werden.\n");
    }
 
    pFile = fopen(filename, "rb");
    fseek(pFile, 128*sizeof(char), SEEK_SET);
    fseek(pFile, 4*sizeof(char), SEEK_CUR);
 
   
   
    printf("\n\n");
    return 0;
}


Code:
1
2
3
4
5
6
7
8
9
10
11
12
"Also am Anfang überprüfen, ob es die Datei gibt und dann öffnen und an die erste Stelle des Bildes springen, den header sozusagen überspringen.
 
Zunachst kommt der so genannte Header der Datei, der eine
Menge an anderen Informationen enthalt (um die wir uns NICHT kummern)
und auch eine variable Groe besitzt. Danach kommt an einer bestimmten Stelle
die Information, dass nun die Bilddaten kommen. Diese Information ndet sich
dadurch, dass man die Daten (als short!) einliest und wenn die hexadezimale Zahlenkombination
(0x7FE0,0x0010) gefunden wird, mussen noch vier char-Daten
ubersprungen werden, dann kommt als long die Anzahl der Bildpunkte und dann
beginnen die Bilddaten (nachzulesen im DICOM-Standard). Die Groe der Bilder
ist (bei der Computertomographie) 512  512 und die Bilddaten sind als short-
Variablen gespeichert."


Das wär der Auszug zum Auslesen, der Schritt fehlt mir eigentlich.

Brauch ich da nicht iwie auch einen Pointer auf die Bildpunkte? Hab ich auch nicht so wirklich.
Muss ja jeden Bildpunkt abtasten und auslesen.

Für den fseek(); befehl muss ich ein anderen pointer als den FILE pointer nehmen oder?


Zuletzt bearbeitet von basti273 am 09:16:08 03.04.2012, insgesamt 3-mal bearbeitet
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 09:40:24 03.04.2012   Titel:              Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>

#define SIZE 50

 
int main(void)
{
    FILE *pFile;
    char filename[SIZE];
// Wo sollen denn deine Daten gespeichert werden ?
 
    printf("Welche Datei wollen sie oeffnen: ");
    scanf("%s", &filename);
//              Da  ^ kommt bei Arrays kein & hin
 
    pFile = fopen(filename,"rb");
    if(pFile)
    {
        printf("Datei wurde geoeffnet!\n");
        fclose(pFile);
    }
    else
    {
        printf("Datei konnte nicht gefunden werden.\n");
// Und was jetzt? Dein Programm läuft weiter als wäre nichts gewesen
    }
 
    pFile = fopen(filename, "rb");
    fseek(pFile, 128*sizeof(char), SEEK_SET);
    fseek(pFile, 4*sizeof(char), SEEK_CUR);
 
// wo ist das lesen mit dem du Schwierigkeiten hast?   
   
    printf("\n\n");
    return 0;
}

Bitte poste hier deinen Code mit dem du arbeitest (per Copy and Paste)
basti273
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
Beitrag basti273 Mitglied 10:32:46 03.04.2012   Titel:              Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>

#define SIZE 50

 
int main(void)
{
    FILE *pFile;
    char filename[SIZE], pixelarray[512][512]; // ins pixelarray sollen die werte gespeichert werden
    char *pixptr = pixelarray;
    int bildgroesse, bildhoehe=512, bildbreite=512, i, j;
 
    printf("Welche Datei wollen sie oeffnen: ");
    scanf("%s", filename); // kein & mehr
 
    pFile = fopen(filename,"rb");
    if(pFile)
    {
        printf("Datei wurde geoeffnet!\n");
        fclose(pFile);
 
        pFile = fopen(filename, "rb");
        fseek(pFile, 128*sizeof(char), SEEK_SET);
        fseek(pFile, 4*sizeof(char), SEEK_CUR);
 
        fread(&pixptr, sizeof(short), 1, pFile);  // auslesen der daten mit fread... aber bin nicht sicher, ob das mit dem pixptr richtig ist...
 
        bildgroesse = bildbreite*bildhoehe;
        printf("Die Bildgroesse ist %d Bytes.", bildgroesse);
 
        for(i=0; i<bildhoehe; i++) // jeden bildpunkt abtasten
        {
            for(j=0; j<bildbreite; j++)
            {
                if(pixelarray[i][j] < -900 || pixelarray[i][j] > 250)
                {
                    pixelarray[i][j] = -1024;
                }
            }
        }
    }
 
    else // die schleife jetzt am ende, damit das programm danach nicht weiterläuft
    {
        printf("Datei konnte nicht gefunden werden.\n");
    }
 
    printf("\n\n");
    return 0;
}


jetzt weiß ich nicht so wirklich weiter, brauch iwie glaub ich ein anderen pointer oder das array anders...
DirkB
Unregistrierter




Beitrag DirkB Unregistrierter 10:49:33 03.04.2012   Titel:              Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
...
    char filename[SIZE], pixelarray[512][512]; // ins pixelarray sollen die werte gespeichert werden
    char *pixptr = pixelarray;
...
    pFile = fopen(filename,"rb");
    if(pFile)
    {
        printf("Datei wurde geoeffnet!\n");
        fclose(pFile);
 :arrow: // Was  soll denn der Mist :confused:  fclose und gleich danach fopen?
        pFile = fopen(filename, "rb");
...
        fread(&pixptr, sizeof(short), 1, pFile);  // auslesen der daten mit fread... aber bin nicht sicher, ob das mit dem pixptr richtig ist...
 :arrow: // Du liest gerade genau 1 short ein und nicht etwa 512x512
 :arrow: // Zudem ist pixptr schon ein Pointer und der braucht hier kein & mehr
        bildgroesse = bildbreite*bildhoehe;   :arrow: // zu spät. musst du früher machen
        printf("Die Bildgroesse ist %d Bytes.", bildgroesse);
 
...             if(pixelarray[i][j] < -900 || pixelarray[i][j] > 250)
 :arrow: // pixelarray ist ein Array das char-Element aufnimmt. Wie willst du da Werte < 128 und > 127 drin abspeichern?
...
                    pixelarray[i][j] = -1024;  
    else // die schleife jetzt am ende, damit das programm danach nicht weiterläuft
 :arrow: // if ist keine Schleife sondern eine Bedingung
...
}
basti273 schrieb:
jetzt weiß ich nicht so wirklich weiter, brauch iwie glaub ich ein anderen pointer oder das array anders...

Du brauchst ein C-Buch und das Kapitel über Arrays und Pointer.

Woher kennst du die Bildgröße?

Mach dir erst einmal klar was du einlesen willst.
Von welchem Typ sind die Daten? char, short oder sonstwas.
c++.de :: C (C89, C99 und C11) ::  Aus Datei lesen  
Gehen Sie zu Seite 1, 2, 3, 4, 5, 6, 7, 8, 9  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.