Dateien 1:1 auslesen für Webserver
-
Mag meinen kleinen Webserver noch dazu bringen Grafiken zu verschicken.
Die HTML Dateien werden momentan mit fread() ausgelesen.
Leider reicht bei mir das Ändern des Headers Content-Type nicht aus.
Wenn er eine GIF datei liest stürtzt er nach ein paar Bytes ab.
Kommen da so kultige multibyte zeichen vor? wo ist denn der datentyp wchar definiert, bei mir liefert der kompiler immer fehler?
oder gibt es noch eine viel bessereLösung zum bitgenauen auslesen mit der API?
Freu mich auf Hilfe
Gruß TheChosn
-
CreateFile / ReadFile ?!
-
fread geht aber auch (sofern die Datei binär geöffnet ist). Der Fehler muss also woanders liegen.
-
also ich öffne mit "rb" falls du das meinst
hier ein bischen code:string readFile(string pfad) { string datei;//länge ist doch hier unbegrenzt,oder? char buffer[102400];//Jaja ist viel zu hoch ich weiss FILE* f=fopen(pfad.c_str(),"rb"); if (f!=NULL) { while((feof(f))==0) { fread(buffer,sizeof(char),102400,f); datei=datei+buffer; } fclose(f); return datei; } else { datei="404"; return datei; } }
gehen da vielleicht irgendwelche zeichen verloren weil das über char & string läuft?
temp=send(s2,sendBuf,(sendBuffer.length()),0);
wenn ich das dann sende, schneidet er einen teil einfach ab und sendet bei nächsten mal mit.
ist sendBuffer.length() irgendwie ne sehr beschränkte int zahl?
oder gibt es sowas wie ne maximal länge die man auf einen satz verschicken kann?Gruß TheChosn
-
Du weisst aber schon das das Stringende anhand eines Nullterminators erkannt wird?
Würde ich eher überwhile(fread(buffer,...)) send(buffer,...);
machen.
-
Warum mischst du eigentlich C und C++?
Wo C++ doch so schöne streams hat.
-
@Nemesyzz
Wenn ich das so wie du mach und beim senden stück für stück einlese
kann ich den header Content-Length nicht vorher abschicken.
ich brauche also alles an einem stück, oder zumindest im array das ich die länge vorher berechnen kann.
oder gibts ne einfache möglichkeit die größe der datei festzustellen?
fread() hängt also keinen nullterminator an? aber wenn ich den buffer mit nem string verknüpfe müsste doch einer drangehängt werden oder?
Ich kill schon mal die dreckige stringklasse@cd9000
zu den streams habe ich das gefunden:
kannst du mir bitte erklären warum der nicht in den selben string weiterschreibt wenn er ein leerzeichen sieht
lesen diese streams dann auch binär?#include <iostream> #include <string> #include <fstream> using namespace std; int main() { string Str; ifstream lesen; lesen.open("Datei.txt"); lesen>>Str; cout<<Str; getchar(); return 0; }
-
Selbst wenn fread einen dranhängen würde gäbe es bei binären Daten probleme. In binären Dateien sind öfters '\0' enthalten.
Um die Größe zu bekommen musst du den Dateizeiger via fseek, SEEK_END auf das Ende setzen. Mit ftell bekommst du dann so die Größe zurück (nicht vergessen den Dateizeiger wieder mit fseek auf den Dateianfang zu setzen). Kannst aber auch mit CreateFile, ReadFile, GetFileSize[Ex] arbeiten.
-
Oder C++ streams.
Du kannst bei ifstream auch angeben, dass die Datei binär geöffnet wird. Der operator>> ist aber zum binären Lesen nicht zu gebrauchen (zumindest mit eingebauten Typen).
ifstream kennt die Methode read.
Damit liest du n Bytes "binär" ein. Wieviele Bytes wirklich eingelesen wurden, oder ob mittendrin die Datei zu Ende war, liefert die Methode gcount().