Filehandle auf Binärmodus umschalten
-
Hallo,
ich lese binär daten aus einer datei mitFILE* fp =fopen(filename,"rb");
Wenn ich die Daten mit
while((c=fgetc(fp))!=EOF) putc(c,stdout);
ausgebe Funktionier das wunderbar mit textdateien
Aber wenn ich binär bzw Bilddaten nehme sie 1zu1 ausgeben will und an z.B. display weiterleiten will kommt nur murks raus.% ./a.out -f test.txt | less #Funktioniert % ./a.out -f test.png | display #Funktioniert nicht
ICh denke, dass ich stdout auch auf Binär Modus umschalten muss. Meine idee wäre ja gewesen mit fclose stdout zu schließen und mit fopen und dem binär Flag neu zu öffnen Aber Was ich als Dateiname nehmen soll ist mir nicht klar. Eine andere Möglichkeit ist (hab ich ansatzweise gelsesen) auch
setmode(fileno(stdout),O_BINARY);
Allerdings ist noch O_BINARY noch _O_BINARY in der fcntl.h definiert. Und setmode resp. _setmode gibts auch nicht in meinen Headerdateien.
Ich weis irgendwie nicht weiter.
Hat jemand einen Tipp für mich?
Gruß Alex
-
Was möchtest du damit erreichen indem du stdout auf "binärmodus" umschaltest oder besser was erwartest du dann zu sehen ?
BTW es gibt keinen "binärmodus" für stdout.
Kurt
-
Ich möchte z.B. eine Bilddatei einlesen oder von stdin lesen, transformieren und auf stdout weiterleiten zu z.B. weitere programme oder an ein Perl-CGI skript. Halt nach guter alter UNIX Manier. Problem ist, dass die 1zu1 Ausgabe nicht zu funktionieren scheint. Jetzt war halt meine Vermutung, dass der Modus des Filehandles stdout evtl. standardmäßig auf O_TEXT steht.
-
Wenn ich mich nicht irre, gibt es auf Linux/Unix keine Unterscheidung Binärmodus/Texmodus.
Und deshalb hat dieses 'b' in dieser Zeile:FILE* fp =fopen(filename,"rb");
keine Bedeutung.
Wahrscheinlich deshalb gibt keinen "Umschalter" für Binär-/Textmodus.
Es ist also praktisch immer Binärmodus, die Zeichen werden beim Lesen/Schreiben nicht verändert.
-
Kannst du mir dann sagen ob ich bei der 1zu1 Ausgabe irgendetwas falsch mache?
#include <stdio.h> #include <getopt.h> #include <fcntl.h> #include <sys/io.h> #define SET_BINARY(f) _setmode(fileno(f),FBINARY) // Prototypen static void print_help(); FILE* open_file(char*); //Globale Variablen struct transform { int top; int left; int right; int bottom; int width; int height; }; struct transform transformdata; char * filename = NULL; // Hauptprogramm int main (int argc,char * argv[]) { char c; int option_index=0; static struct option long_options[]={ {"top",required_argument,NULL,'t'}, {"right",required_argument,NULL,'r'}, {"bottom",required_argument,NULL,'b'}, {"width",required_argument,NULL,'w'}, {"height",required_argument,NULL,'h'}, {"file",required_argument,NULL,'f'}, {0,0,0,0} }; /* Parse Command Line Options */ while ((c=getopt_long(argc,argv,"t:l:r:b:x:y:f:",long_options,&option_index))!=-1) { switch (c) { case ('t'): transformdata.top = (int)optarg; break; case ('l'): transformdata.left = (int)optarg; break; case ('r'): transformdata.right = (int)optarg; break; case ('b'): transformdata.bottom = (int)optarg; break; case ('x'): transformdata.width = (int)optarg; break; case ('y'): transformdata.height = (int)optarg; break; case ('f'): filename = (char*)optarg ; break; case ('?'): print_help(); exit(0); break; } } FILE* file = open_file(filename); //SET_BINARY(stdout); while ((c=fgetc(file))!=EOF) putc(c,stdout); fclose(file); return 0; }//main // Hilfe Seite static void print_help() { } //Offnen der Datei FILE* open_file(char* filename) { FILE* file; //SET_BINARY(file); if (filename==NULL) return stdin; if((file=fopen(filename,"rb"))==NULL) { perror("Failed to open file"); exit(1); } return file; }
Wie gesagt bei Textdateien geht es bei Bilddateien nicht.
Gruß Alex
-
Cool. Habs. mit fread und fwrite funktioniert es.
Gruß Alex
-
dein fehler: fgetc gibt ints zurueck, keine chars. ein EOF auf char abgeschnitten koennte alles moegliche sein.