// Liest Renishaw-RTD-Dateien ein und wandelt die Binärdaten in ASCII-Daten um
// Oder auch RTX-Dateien
// Von Dateiname1 nach Dateiname2 (blödes Windows!)
#include <stdio.h>
#include <string.h>
// msvcrt-light.lib für Visual Studio 2005 sowie Gleitkommaverwendung zugänglich machen
extern "C" _CRTIMP void _cdecl __getmainargs(int*,char***,char***,void*,void*);
extern "C" void* _imp___ftol;
extern "C" _declspec(naked) int _ftol2_sse() {_asm jmp [_imp___ftol]}
extern "C" int _fltused; int _fltused;
extern "C" _CRTIMP FILE _iob[3];
#undef stdin
#undef stdout
#undef stderr
#define stdin (_iob+0)
#define stdout (_iob+1)
#define stderr (_iob+2)
int main(int,char**,char**);
int mainCRTStartup() {
int argc;
char **argv;
char **envp;
__getmainargs(&argc,&argv,&envp,NULL,&envp);
return main(argc, argv, envp);
}
int main(int argc, char**argv, char**) {
float fSamples,fInterval=0;
int iSamples=0;
int iFlag;
char line[1024];
FILE *in=stdin,*out=stdout; // geht nur bei Linux, da Binär = Text
if (argc>1) in = fopen(argv[1],"rb"); // Unter DOS/Windows zwingend
if (argc>2) out = fopen(argv[2],"wb");
while (fgets(line,sizeof(line),in)) { // Zeilen lesen
fputs(line,out); // Echo
if (sscanf(line,"Sample no :%f",&fSamples)==1) iSamples=(int)fSamples;
sscanf(line,"Trigger interval :%f",&fInterval);
sscanf(line,"Flags: %d",&iFlag);
if (strcmp(line,"Run Target Data:\r\n")==0) { // jetzt kommt der Binärschrott
if (!iSamples) {
perror("Samplezahl nicht gefunden!");
return 1;
}
retry:
switch (iFlag) {
case 2: { // RTX: DOUBLE?
double *adValues = new double[iSamples];
if (!adValues) {
perror("Kein Speicher fuer Samples!");
return 2;
} // Hier besteht der Binärkrempel aus Abweichungen in mm!
fread(adValues,sizeof(double),iSamples,in);
for (int i=0; i<iSamples; i++) {
fprintf(out,"%d\t%.4f\t%.4f\r\n",i,fInterval*i,adValues[i]);
}
delete[] adValues;
}break;
case 3: { // RTD:
float *afValues = new float[iSamples];
if (!afValues) {
perror("Kein Speicher fuer Samples!");
return 2;
} // Der Binärkrempel besteht aus Messwerten (in mm), NICHT aus Abweichungen!
fread(afValues,sizeof(float),iSamples,in);
for (int i=0; i<iSamples; i++) {
fprintf(out,"%d\t%.4f\t%.4f\r\n",i,afValues[i],afValues[i]-fInterval*i);
}
delete[] afValues;
}break;
default: { // raten anhand Datei-Restgröße (140107)
fprintf(stderr,"Flag = %d (unbekannt) - errate Datentyp nach Dateigroesse ... ",iFlag);
unsigned long p=ftell(in);
fseek(in,0,SEEK_END);
unsigned long q=ftell(in)-p;
fseek(in,p,SEEK_SET);
if (q>=iSamples*sizeof(double)) {fprintf(stderr,"DOUBLE\n"); iFlag=2; goto retry;}
if (q>=iSamples*sizeof(float)) {fprintf(stderr,"SINGLE\n"); iFlag=3; goto retry;}
}perror("Unbekannter Binärdatentyp!");
}
}
}
fclose(out);
return 0;
}
| Detected encoding: ANSI (CP1252) | 4
|
|
|