Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Fil till char*

Postades av 2008-07-08 14:35:15 - Fredrik Hofflander, i forum c++, Tråden har 5 Kommentarer och lästs av 1529 personer

Hej

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?


Svara

Sv: Fil till char*

Postades av 2008-07-08 15:13:44 - Niklas Jansson

Alltså... du får ju kompileringsfel, koden är felaktig. Kan du C++? (no offence)

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.html


Svara

Sv:Fil till char*

Postades av 2008-07-09 10:10:04 - Fredrik Hofflander

Hej

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?


Svara

Sv: Fil till char*

Postades av 2008-07-09 10:12:34 - Fredrik Hofflander

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.


Svara

Sv:Fil till char*

Postades av 2008-07-09 12:21:34 - Niklas Jansson

Faktum är att du faktiskt redan har fått ett svar i länken; lite modifierat blir det:

#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.


Svara

Sv: Fil till char*

Postades av 2008-07-09 15:50:22 - Fredrik Hofflander

Tackar... nu verkar det funka


Svara

Nyligen

  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit
  • 12:08 Indian casino
  • 04:14 Vad finns det för kratomalternativ
  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 869
27 965
271 770
880
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies