Source file: /~heha/mb-iwp/RTD-RTX-Konverter.zip/src/RTD.cpp

// 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
Wrong umlauts? - Assume file is ANSI (CP1252) encoded