Array als Rückgabewert
-
hallo,
ich bin ein C++ Neuling and habe ein paar Schwierigkeiten mit Arrays
.ich möchte ein bitmap File lesen und die dimensionen (Breite,Höhe) als 2d-Array zurückgeben können.In der Funktion ReadHeader sollte man den Pfad,wo sich das Bild befindet als Argument eingeben.So sieht mein Code aus:[#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <fstream>
typedef struct
{
int Size; /* Size of the image /
int res; / reserved zone /
int offset; / address of the beginning of the image /
int info; / size of the zone information /
int width; / Width of the image /
int height ; / Height of the image /
int tim; / Size of the image in bytes /
int Hres; / horizontal resolution /
int Vres; / vertical resolution /
int nbco; / number of colors used /
int impco; / number of important colors */
} bitmap_header;//ReadHeader sollte B[width][height] zurückgeben
void ReadHeader(char *Titel, int B[][] )
{
FILE *bmp_file;
bitmap_header bmp_header;
char sign[3];bmp_file=fopen("Titel.bmp","r");
fgets( sign, sizeof sign , bmp_file);
puts(sign);/* read the header in only one line */
fread( &bmp_header, sizeof bmp_header, 1, bmp_file );printf("width= %d, height= %d\n", bmp_header.width, bmp_header.height);
fclose(bmp_file);
}
]
Ich kann bis jetzt nur die Dimensionen auf der Konsolen geben.Ich
möchte aber das Bild als Array haben.Hätte Jemand eine Idee
?
Danke
-
Aufräumen!
#include <utility> // std::pair, std::make_pair #include <cstring> // std::strcmp #include <fstream> struct bitmap_header_t { int Size; /* Size of the image */ int res; /* reserved zone */ int offset; /* address of the beginning of the image */ int info; /* size of the zone information */ int width; /* Width of the image */ int height ; /* Height of the image */ int tim; /* Size of the image in bytes */ int Hres; /* horizontal resolution */ int Vres; /* vertical resolution */ int nbco; /* number of colors used */ int impco; /* number of important colors */ }; std::pair<int, int> read_header(const char* file_name, bitmap_header_t& dest) { std::ifstream file_stream(file_name, std::ios_base::binary); char sign[4] = { 0 }; file_stream.read(sign, sizeof(char) * 3); if (std::strcmp("BMP", sign) != 0) throw std::invalid_argument("invalid format"); file_stream.read(reinterpret_cast<char*>(&dest), sizeof(bitmap_header_t)); return std::make_pair(dest.width, dest.height); }Wobei die Bitmap-Header-Struktur falsch ist!
-
Das nennt man eine prompte Antwort

warum sollte die Bitmap-Header-Struktur falsch sein?
ich muss gestehen, dass ich die folgenden Zeilen nicht versteht:
std::ifstream file_stream(file_name, std::ios_base::binary); char sign[4] = { 0 }; file_stream.read(sign, sizeof(char) * 3); if (std::strcmp("BMP", sign) != 0) throw std::invalid_argument("invalid format"); file_stream.read(reinterpret_cast<char*>(&dest), sizeof(bitmap_header_t));Könntest Du Sie mir bitte erklären?
-
std::ifstream file_stream(file_name, std::ios_base::binary); // Datei zum binären Lesen öffnen char sign[4] = { 0 }; // einen String aufn Stack und mit 0 initialisieren. Wichtig ist, dass sign[ 3 ] = 0. file_stream.read(sign, sizeof(char) * 3); // Die ersten 3 Bytes nach sign lesen. if( std::strcmp( "BMP", sign ) != 0 ) // Gucken, ob die ersten 3 Bytes BMP sind. throw std::invalid_argument( "invalid format" ); // sonst eine exception schmeißen file_stream.read(reinterpret_cast<char*>( &dest ), sizeof( bitmap_header_t ) ); // dann den restlichen Header lesen.greetz, Swordfish
-
danke schön.jetzt verstehe ich viel besser

ich bekomme beim Kompilieren (VC++ 6.0) der folgenden Zeile:if( std::strcmp( "BMP", sign ) != 0 )die folgende Fehlermeldung:
C:\VisualC\...\Test.cpp(27) : error C2039: 'strcmp' : Ist kein Element von 'std'
beim Weglassen von 'std' habe ich noch mehr Fehler.....
Ach ja,ich benutze WinXP und VC ++ 6.0