fputs speicherzugriffsfehler..
-
hallo, hab ein programm geschrieben welches einen request an einen server schickt und den entsprechenden response dann in eine datei mittels fputs schreiben soll. nur leider klappt das absolut nicht und ich versteh beim besten willen nicht warum.
hier ein code ausschnitt:
bool WebGet::open_closeFile(bool action,FILE* save){ if (action) // true { save = fopen("zettel.html","w+"); if (save == NULL) return false; else return true; }else { // false if (fclose(save) == 0) return true; else return false; } } bool WebGet::saveFile(char output,FILE* save){ cout << "save" << endl; if (fputs(output,save) > 0) return true; else return false; return true; }
und noch folgendes:
char WebGet::getHTML() { err = write(sCon, Query, strlen(Query)); if(err != sizeof(Query)) { char buffer[4096]; int i = 0; FILE* save; if (open_closeFile(true,save)) { do { i = read(sCon, buffer, sizeof(buffer)); strcat( buffer ,"\0"); /*if (!(saveFile(buffer,save))) { cout << "Fehler beim Schreiben in Datei" << endl; break; }*/ cout << "versuche zu schreiben: " << endl; fputs(buffer,save); } while(i != 0); if (!(open_closeFile(false,save))) cout << "Fehler beim Schließen der Datei: zettel.html" << endl; }else cout << "Fehler beim öffnen der Datei: zettel.html" << endl; } }
Hab mal aus der Funktion die Einbindung der extra Funktion zum in Datei schreiben rausgenommen und das einfache fputs reingeknallt. genau an der stelle kommt nen speicherzugriffsschutzfehler und ich hab keine ahnung wie ich das beheben kann...
rein von der theorie her muesste das doch passenhoffe jemand sieht den fehler *betet*
danke und gruß
sengi
-
Sengi schrieb:
bool WebGet::saveFile(char output,FILE* save){ cout << "save" << endl; if (fputs(output,save) > 0) return true; else return false; return true; }
Vielleicht sollte der Parameter "output" ein Char-Pointer anstatt nur eines einzelnen Chars sein?
-
also einfach anstatt char output nen (char *)output ??
-
ja,
char *output; //Speichert die Adresse des übergebenen Strings, also eine Folge von Zeichen. char output wäre nur ein einzelnes Zeichen
-
habs nun "geändert" bringt nix
bool WebGet::saveFile(char* output,FILE* save){ cout << "save" << endl; if (fputs(output,save) > 0) return true; else return false; }
aufrufen tu ich die fkt so:
if (!(saveFile(buffer,save))) { cout << "Fehler beim Schreiben in Datei" << endl; break; }
hat vielleicht sonst noch jemand eine idee?
-
Siehe Doku, ein String muss übergeben werden.
Bye, TGGC (Wähle deine Helden)
-
ÜBERSICHT
#include <stdio.h>int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(char *s);
int ungetc(int c, FILE *stream);hm? sicher?
-
-
Sengi schrieb:
bool WebGet::saveFile(char* output,FILE* save){ cout << "save" << endl; if (fputs(output,save) > 0) return true; else return false; }
bool WebGet::saveFile(const char *output, FILE *save) { int result = fputs(output, save); cout << "save:"<< result << endl; return result >= 0; }
Mit String meint TGGC einen C-String. Du versuchst doch selber einen C-String sicherzustellen indem du schreibst:
Sengi schrieb:
strcat( buffer ,"\0");
Das solltest Du aber anders machen, denn strcat erwartet selbst C-Strings, und wenn Dein buffer nicht 0-terminiert ist => Pustekuchen. Außerdem wird vielleicht (eigentlich höchstwahrscheinlich) buffer mit read bis zum Anschlag voll gemacht, wegen sizeof(buffer). Versuche doch mal höchstens sizeof(buffer)-1. Die Variable i, in die Du das Ergebnis von read einliest, beinhaltet wahrscheinlich die tatsächlich gelesene Anzahl bytes. Anstatt strcat kannst Du dann
buffer[i]=0;
bzw.
buffer[i]='\0';
schreiben.