fwrite löst ERROR_INVALID_USER_BUFFER aus
-
Schönen Abend zusammen,
ich würde gerne wissen, warum die fwrite-Funktion gar nichts bzw. nur eine gewisse Anzahl in meine Datei schreibt und GetLastError() dann mit 1784 returnt (ERROR_INVALID_USER_BUFFER).
Ich rufe die Funktion vier Mal auf, dreimal funktioniert alles, nur der letzten Brocken will nicht komplett in die Datei. Es werden je nachdem welche TestDatei ich verwende 0 bis 4042 Bytes hineingeschrieben.
"m_Bits" ist ein Void-Pointer und zeigt auf das Bitfeld. Void deshalb weil der Speicher unterschiedlich aufgeteilt sein kann (BYTE, WORD, DWORD, RGBQUAD).
Gibt es eine Obergrenze an Bytes für fwrite? Oder ist der void*-Pointer das Problem. Prinzipiell müsste alles gehen weil ich sowohl Größe als auch Anzahl angebe? (Die if-Bedingung unten stimmt nicht, weil die Parameter von fwrite() vorher vertauscht warten (Größe <--> Anzahl)
// m_Dumper ist eine Klasse die Fehler- und Logmeldungen sammelt // Öffne datei in "binary-mode" mit Lese- und Schreiberecht if (_tfopen_s(&file,name,_STR("wb+")) != 0) { return m_Dumper->Add(_STR("File has not been created! [HBitmap::SaveBitmap]"),true); } else { m_Dumper->AddEx(_STR("File WAS opened (0x%p)! [HBitmap::SaveBitmap]"),file); } // Erster Teil der Bitmap --> funktioniert writ = fwrite(&m_filehead,sizeof(BITMAPFILEHEADER),1,file); m_Dumper->AddEx(_STR("Writing %d of BITMAPFILEHEADER"), writ); if (writ != 1) { m_Dumper->Add(_STR("Writing error --> BITMAPFILEHEADER [HBitmap::SaveBitmap]"), true); fclose(file); _tremove(name); } // Zweiter Teil --> funktioniert writ = fwrite(&m_header,sizeof(BITMAPINFOHEADER),1,file); m_Dumper->AddEx(_STR("Writing %d of BITMAPINFOHEADER"), writ); if (writ != 1) { m_Dumper->Add(_STR("Writing error --> BITMAPINFOHEADER [HBitmap::SaveBitmap]"), true); fclose(file); _tremove(name); } // Color wird durch den BitCount-Wert im InfoHeader der Bitmap berrechnet // schreibt ebenfalls alles ohne Probleme if (m_header.biBitCount < 16) { writ = fwrite(&m_Palette,sizeof(RGBQUAD),Colors,file); m_Dumper->AddEx(_STR("Writing %d palette entries!"),writ); if (writ != Colors) { m_Dumper->Add(_STR("Writing error --> PALETTE-ENTRIES [HBitmap::SaveBitmap]"), true); fclose(file); _tremove(name); } } // Wrapper Funktion --> SetLastError(0) zur Kontrolle: Dieser Fehler tritt in der nächsten Zeile auf m_Dumper->Set(0); // Hier tritt der Fehler auf, m_Bits ist der Zeiger auf das Bitfeld und m_BitSize die insgesamte Größe (von InfoHeader.biSizeImage) writ = fwrite(&m_Bits,sizeof(BYTE),m_BitSize,file); if (writ != 1){ m_Dumper->AddEx(_STR("Writing error --> BITMAP-BITFIELD (%d bytes) [HBitmap::SaveBitmap]"),writ); fclose(file); m_Dumper->DisplayErrors(NULL); return m_Dumper->CriticalError(); } else if (IsLogModeOn()) { m_Dumper->AddEx(_STR("Writing %d byte of image data"),writ); }
-
Bist du im falschen Forum gelandet (wolltest ins C-Forum)?
-
314159265358979 schrieb:
Bist du im falschen Forum gelandet (wolltest ins C-Forum)?
Ich fürchte, dass soll tatsächlich C++ sein. Die Benutzung von Memberfunktionen deutet dies an.
C/C++-Mix. Dein Stichwort.
-
Wie schreibe ich eine Datei in C++:
#include <fstream> #include <iostream> int main() { std::ofstream out("file.txt"); // Alternativ als zweiten Parameter Öffnungs-Art, wie binary angeben if(!out.is_open()) { std::cout << "Fehler beim Öffnen." << std::endl; return 1; } os << some << stuff; if(out.fail()) { std::cout << "Fehler beim Schreiben." << std::endl; return 1; } return 0; }
-
Darum geht es hier doch erstmal garnicht.
Ich denke, m_Bits ist ein Zeiger (unsigned char*), du übergibst die _Adresse_, entferne mal das & davor.
-
Japp, das wars, ich hab einfach vom Pointer-Pointer aus geschrieben...
Wundert mich nur, dass das überhaupt funktioniert hat.SeppJ schrieb:
C/C++-Mix. Dein Stichwort.
Wenn mans genau nimmt besteht C++ aus C (der ursprüngliche Name lautete "C with classes). Aber du hast recht, es gibt die iostream-Klassen dafür. Ich verwende nur HIER die C-Funktionen. Aber nur deshalb, weil sie mir besser vertraut sind als of und if-stream.
Hat sich somit erledigt und kann geclosed werden.
-
Besch schrieb:
Ich verwende nur HIER die C-Funktionen. Aber nur deshalb, weil sie mir besser vertraut sind als of und if-stream.
Das ist kein Grund, nichts neues zu lernen.

-
Besch schrieb:
Japp, das wars, ich hab einfach vom Pointer-Pointer aus geschrieben...
Wundert mich nur, dass das überhaupt funktioniert hat.Glückstreffer - bei undefiniertem Verhalten kann alles passieren (auch daß es mal zufällig "funktioniert").
SeppJ schrieb:
C/C++-Mix. Dein Stichwort.
Wenn mans genau nimmt besteht C++ aus C (der ursprüngliche Name lautete "C with classes). Aber du hast recht, es gibt die iostream-Klassen dafür. Ich verwende nur HIER die C-Funktionen. Aber nur deshalb, weil sie mir besser vertraut sind als of und if-stream.
Hat sich somit erledigt und kann geclosed werden.
Ja, C existiert noch als Bestandteil von C++, aber trotzdem ist es idR üblich, die Mittel von C++ zu verwenden, wenn welche zur Verfügung stehen.