Hej Alltså... du får ju kompileringsfel, koden är felaktig. Kan du C++? (no offence) Hej Just det, andra hållet måste funka också. dvs när jag får en data och datalength så skall jag kunna skapa en fil med. Faktum är att du faktiskt redan har fått ett svar i länken; lite modifierat blir det:Fil till char*
Jag har en binär fil som jag vill representera som en char*. Filens storlek kan variera mellan 10 kb och 4 gb så jag kan inte bestämma någon buffertstorlek innan. Efteråt vill jag kunna göra char* till en fil igen.
Det bästa hade varit om filens namn också kan sparas i början.
Det jag hittills försökt med är:
char* fileName;
cout << "filename? ";
cin >> fileName;
fstream myFile;
_off_t fileSize;
struct stat results;
if (stat(fileName, &results) == 0)
fileSize = results.st_size;
else
{
cout << "Error1 reading file" << endl;
}
char data[fileSize];
ifstream myFile (fileName, ios::in | ios::binary);
myFile.read (data, fileSize);
if (!myFile) {
cout << "Error2 reading file" << endl;
}
ofstream myFile ("tempdata.exe", ios::out | ios::binary);
myFile.write (data, fileSize);
Får då dessa fel:
.\TestUIClient.cpp(129) : error C2057: expected constant expression
.\TestUIClient.cpp(129) : error C2466: cannot allocate an array of constant size 0
.\TestUIClient.cpp(129) : error C2133: 'data' : unknown size
.\TestUIClient.cpp(130) : error C2371: 'myFile' : redefinition; different basic types
.\TestUIClient.cpp(117) : see declaration of 'myFile'
.\TestUIClient.cpp(132) : error C2088: '!' : illegal for class
.\TestUIClient.cpp(142) : error C2371: 'myFile' : redefinition; different basic types
.\TestUIClient.cpp(117) : see declaration of 'myFile'
Någon som har koll på vad som behöver göras?Sv: Fil till char*
Felen pekar förmodligen på andra rader än de du visar, och det ser ut som att du har försökt kopiera en kodbit och bara använda den?
Grundprincipen är att det (oftast) inte är så himla bra att lägga in filer i char-arrayer utan bättre att använda filerna direkt. Sen är det nästan alltid bättre att använda std::string än char-arrayer från början.
Men om du prompt ska göra så, så är det enklaste att öppna filen, räkna antalet tecken och lägga in det, se http://www.cplusplus.com/reference/iostream/istream/seekg.htmlSv:Fil till char*
Hittade vad som var fel på koden. Den kompilerar om man kör char* data = new char[fileSize] istället för char data[fileSize] :
char* fileName;
cout << "filename? ";
cin >> fileName;
//fstream myFile;
_off_t fileSize;
struct stat results;
if (stat(fileName, &results) == 0)
fileSize = results.st_size;
else
{
cout << "Error 1 reading file" << endl;
continue;
}
char* data = new char[fileSize];
ifstream myFile (fileName, ios::in | ios::binary);
myFile.read (data, fileSize);
if (!myFile) {
cout << "Error 2 reading file" << endl;
continue;
}
//char* MessagePointer;
//memmove(MessagePointer, fileName.c_str(), fileName.size());
//memmove(MessagePointer+fileName.size(), data, fileSize);
ofstream my2File ("tempdata.exe", ios::out | ios::binary);
my2File.write (data, fileSize);
continue;
Jag kan C++ sådär som det är just nu. Kan java bra men måste tyvärr jobba med C++ på jobbet. Det jag vill göra är att läsa in en binär fil till en char* då den kod jag jobbar med använder char* för att skicka meddelanden via nätet (Inte något jag kan göra något åt). Anledning till detta är att det är olika typer av meddelanden som skickas och inte alltid filer, men alla skall kunna skickas på samma sätt, aja, inte det viktiga.
Det jag just nu vill göra är alltså att få till en funktion liknande:
void file2char(string filename, char* data, int datalength)
där data och datalength då blir "returvärdena".
Koden ovan kompilerar som sagt, får dock skumma runtimeerror som jag inte kan hitta varför. Någon som vet hur man kan skriva ovannämnda funktion på ett bättre sätt än jag gjort?Sv: Fil till char*
Sv:Fil till char*
#include <iostream>
#include <fstream>
void file2char(std::string filename, char* &data, size_t &datalength)
{
ifstream is(filename.c_str(), ios::binary);
// get length of file:
is.seekg (0, ios::end);
datalength = is.tellg();
is.seekg (0, ios::beg);
// allocate memory:
data = new char [datalength];
// read data as a block:
is.read (data, datalength);
is.close();
}
Och något motsvarande kan du göra även för out (http://www.cplusplus.com/reference/iostream/ostream/write.html):
#include <iostream>
#include <fstream>
void char2file(std::string filename, char* data, size_t datalength)
ofstream os (filename.c_str(), ofstream::binary);
// write to outfile
os.write (data, datalength);
// release dynamically-allocated memory
delete[] data;
os.close();
}
Jag har med "delete [] data;" här, det måste göras någonstans, men var du vill lägga det beror lite på hur programmet ser ut i övrigt.