Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
02.04.2004, 16:45
KennyMcCormick



Quellcode://irgendwann mal die datei erstellen:
char tmp[10000];
ofstream oo("/music/datei.mp3",ios::binary);
oo.write(tmp,10000);
oo.close();


//irgendwann mal datei öffnen und an die position 5000 Hallo schreiben
string buffer = "Hallo";
ofstream oo("/music/datei.mp3",ios::binary);
oo.seekp(5000,ios::beg);        
oo.write(buffer.c_str(),buffer.length());
oo.close();
Ergebnis ist eine datei mit 5005Byte größe. diese datei mit beliebigem editor (kate) geöffnet bringt ein Hallo (5Byte) und nach dem Speichern eine ebenfalls 5Byte große datei...

warum? wie mach ich das, dass die datei immernoch 10000Byte groß ist und nur die bytes 5000 - 5005 (Hallo) überschrieben werden?

--

zum Seitenanfang zum Seitenende Profil || Suche
001
02.04.2004, 18:51
Archangel



-müll-

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005


Dieser Beitrag wurde am 02.04.2004 um 18:52 von Archangel bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
02.04.2004, 20:09
WareWolf



oo.write(buffer.c_str(),buffer.length());
schreibt dir wohl nur die 5 Bytes als Datei auf die Platte
du solltest erst das char array ändern und dann die komplette Datei speichern
oo.write(tmp,10000);
(behaupte ich mal als Laie)

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW

zum Seitenanfang zum Seitenende Profil || Suche
003
02.04.2004, 20:20
KennyMcCormick



mh, aber nicht wenn meine datei 70MB oder noch mehr groß ist, da ich die ja nicht mal schnell einlesen und ändern kann. was ich will ist folgendes in nur c++ net in VB:

Quellcode:dim fno as integer
dim bb() as byte
fno = freefile
open "/music/datei.mp3" for binary as #fno
seek(fno,5000)
redim bb(4)
bb = strconv(vbfromunicode,"Hallo") 'Glaub ich jetzt so aus dem kopf...
put #fno,,bb
close #fno
das ersetzt mir in der datei die bytes 5000 5001 5002 5003 und 5004 mit dem wert Hallo (wenn ich jetzt keinen fehler gemacht hab...) nur will ich das jetzt in c++ aber da will das nicht! *grummel wie die hummel*

--

zum Seitenanfang zum Seitenende Profil || Suche
004
03.04.2004, 02:07
Leviathan



Ich würde es mal mit den C-LowLevel-Dateizugriffsfunktionen versuchen:
Datei öffnen mit open("datei.ext",O_WRONLY,0), Filedescriptor fd (ein int) speichern, mit lseek(fd,5000,0) Position in der Datei setzen und dann mit write(fd,buf,5) die Daten in die Datei schreiben.
Quellcode:int fd;
char buf[6]="Hallo";
fd=open("/music/datei.mp3",O_WRONLY,0);
lseek(fd,5000,0);
write(fd,buf,5);
Der Code ist ohne Garantie, mit den LowLevel-Funktionen habe ich erst einmal gearbeitet.

Die LowLevel-Dateizugriffsfunktionen gehören eigentlich zum Unix-Systeminterface, aber der MS-Compiler bringt etwas Vergleichbares mit, und MinGW und gcc haben die Funktionen soweit ich weiss auch.
Die ganzen Funktionen steht in Kernighan, Ritchie, "The C Programming Language" recht genau beschrieben, allerdings die Unix-Versionen. In der Compiler-Dokumentation sollte aber was zu den Funktionen stehen.

--

Entities: HL | HL²
Kompilierfehler
r_speeds | mehr über r_speeds

zum Seitenanfang zum Seitenende Profil || Suche
005
03.04.2004, 02:23
CN



-editier ich mal weg ;)

so gehts:
Quellcode:#include <stdlib.h>

#define O_WRONLY 0x1

int main()
{
    char tmp[10000];
    char *buf = "Hallo";
    int fd = open("datei.mp3", O_WRONLY);

    write(fd, tmp, sizeof(tmp));
    lseek(fd, 5000, 0);
    write(fd, buf, 5);

    close(fd);

    return 0;
}
das is allerdings c
O_WRONLY musste ich selbst definen da da stdlib.h mit stand.h conflicted hat oder sowas ka.. das define hab ich 1:1 gepastet

..
und so auch
Quellcode:#include <fstream>

using namespace std;

int main()
{
    char tmp[10000];
    char *buf = "Hallo";

    ofstream file("datei.mp3", ios::binary);  

    file.write(tmp, sizeof(tmp));
    file.seekp(5000, ios::beg);
    file.write(buf, 5);

    file.close();

    return 0;
}
lag wohl daran dass du mit dem erneuten öffnen der datei den alten inhalt überschrieben hast

tmp wird nix zugewiesen, das heisst du schreibst randomdaten da rein, ka ob das so sein soll
ausserdem lässt sich das in der form wie du es da hast nich compilen auf grund der redeclaration von oo

--


Dieser Beitrag wurde am 03.04.2004 um 04:14 von CN bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
03.04.2004, 10:41
KennyMcCormick



Danke danke, aber es hat noch nicht funktioniert...

@Leviathan + CN-Beispiel1: Das will bei mir net! open sei nicht deklariert...

@CN-Beispiel2: Ich will die datei ja nochmal öffnen, die datei wird zuerst nur angelegt, um dann irgendwann mal mit daten zu gefüllt zu werden. Das kann auch nach einem neustart des Programmes erfolgen. ich habe das oo nur zweimal deklariert, weil das verdeutlichen sollte, dass das auch an komplett anderen positionen im text vorkommt...

Als Info, ich benutze Linux, keine MS-Produkte...

*langsam verzweifel*

--

zum Seitenanfang zum Seitenende Profil || Suche
007
03.04.2004, 13:20
[RMen]OneStone



Einfach als Open-Appending (für fopen ist das "at" / "ab") öffnen...

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
008
03.04.2004, 15:20
theDon



mmap():

/edit: da fehlt natürlich das komplette error-handling

Quellcode:#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <strings.h>

int main()
{
  int f = open("foo.mp3", O_CREAT | O_RDWR, S_IRWXU);

  ftruncate(f, 5005);

  char* b = mmap(0, 5005, PROT_WRITE, MAP_SHARED, f, 0);

  printf("%d\n", b);

  bzero(b, 5005);

  strncpy(b + 5000, "hallo", 5);

  munmap(b, 5005);
  
  close(f);

  return 0;
}

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before


Dieser Beitrag wurde am 03.04.2004 um 15:21 von theDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche