这是一个纯C语言写的dir文件的读取,我加以改进,主要把病人的信息和dir里面文件的各个文件的路径给保存下来。
这个程序时一次在论坛上搜到的,据说是一个小日本写的。我在VS2008中使用过,现在不搞这个了,把源代码给贴上来,希望对搞医学图像方面的人有帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fp;
static int Patients_number;
typedef struct _ImageProperty
{
int height;
int width;
long min;
long max;
}iproperty;
iproperty ip;
struct Paitent{
char name[100];
char date[30];
char parts[100];
short int first;
};
typedef struct _Tag{
unsigned short group;
unsigned short element;
}tag;
typedef enum
{
unknown=0,
StudyDescription,
StudyDate,
ImageTime,
Manufacturer,
InstitutionName,
PatientsName,
PatientsSize,
PatientsWeight,
SliceThickness,
Gantry,
SliceLocation,
Rows,
Columns,
PixelSpacing,
PixelAspectRatio,
BitsAllocated,
BitsStored,
HighBit,
PixelRepresentation,
SmallestImagePixelValue,
LargestImagePixelValue,
WindowCenter,
WindowWidth,
PixelData,
GroupLength,
FilesetID,
FilesetDescriptorFileID,
SpecificCharacterSetOfFilesetDescriptorFile,
OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity,
OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity,
FilesetConsistencyFlag,
DirectoryRecordSequence,
OffsetOfTheNextDirectoryRecord,
RecordInuseFlag,
OffsetOfReferencedLowerLevelDirectoryEntry,
DirectoryRecordType,
PrivateRecordUID,
ReferencedFileID,
MRDRDirectoryRecordOffset,
ReferencedSOPClassUIDInFile,
ReferencedSOPInstanceUIDInFile,
ReferencedTransferSyntaxUIDInFile,
NumberOfReferences
}datatype;
typedef enum
{
i16=0,
i32,
other
}datasize;
static int fileNo;
char **fileList;
Paitent * partent_Num;
int
myfputs(const char *str, FILE *stream)
{
//return fputs(str,stream);
return 1;
}
int
readSQ(char** fl)
{
int Count;
tag t;
datatype dt;
datasize sz;
short size16;
short data16;
long data32;
long size32;
size_t size;
char VR[3];
char *Value;
VR[0]=VR[1]=VR[2]=0;
FILE *fpcp;
if (fl == 0){
Count=1;
}else{
Count=0;
}
if (0 == fread(&t,sizeof(_Tag),1,fp)){
return 1;
}
fpcp = fp;
#ifdef DEBUG
fprintf(stderr,"%X,%X,",t.group,t.element);
#endif
switch (t.group){
case 0xFFFE:/
switch(t.element){
case 0xE000:
myfputs("---------------start--------------/n", stderr);
fseek(fp,4,SEEK_CUR);
return 0;
break;
case 0xE00D:
myfputs("-----------------end--------------/n",stderr);
return 0;
}
break;
case 0x0004:///
switch(t.element){
case 0x0000:
dt=GroupLength;
myfputs("GroupLength,",stderr);
break;
case 0x1130:
dt=FilesetID;
myfputs("FilesetID,",stderr);
break;
case 0x1141:
dt=FilesetDescriptorFileID;
myfputs("FilesetDescriptorFileID,",stderr);
break;
case 0x1142:
dt=SpecificCharacterSetOfFilesetDescriptorFile;
myfputs("SpecificCharacterSetOfFilesetDescriptorFile,",stderr);
break;
case 0x1200:
dt=OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity;
myfputs("OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity,",stderr);
break;
case 0x1202:
dt=OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity;
myfputs("OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity,",stderr);
break;
case 0x1212:
dt=FilesetConsistencyFlag;
myfputs("FilesetConsistencyFlag,",stderr);
break;
case 0x1220:
dt=DirectoryRecordSequence;/
myfputs("DirectoryRecordSequence,",stderr);
break;
case 0x1400:
dt=OffsetOfTheNextDirectoryRecord;
myfputs("OffsetOfTheNextDirectoryRecord,",stderr);
break;
case 0x1410:
dt=RecordInuseFlag;
myfputs("RecordInuseFlag,",stderr);
break;
case 0x1420:
dt=OffsetOfReferencedLowerLevelDirectoryEntry;
myfputs("OffsetOfReferencedLowerLevelDirectoryEntry,",stderr);
break;
case 0x1430:
dt=DirectoryRecordType;
myfputs("DirectoryRecordType,",stderr);
break;
case 0x1432:
dt=PrivateRecordUID;
myfputs("PrivateRecordUID,",stderr);
break;
case 0x1500:
dt=ReferencedFileID;///
myfputs("ReferencedFileID,",stderr);///
break;
case 0x1504:
dt=MRDRDirectoryRecordOffset;
myfputs("MRDRDirectoryRecordOffset,",stderr);
break;
case 0x1510:
dt=ReferencedSOPClassUIDInFile;
myfputs("ReferencedSOPClassUIDInFile,",stderr);
break;
case 0x1511:
dt=ReferencedSOPInstanceUIDInFile;
myfputs("ReferencedSOPInstanceUIDInFile,",stder