2016-07-14 14 views
0

Ich lese eine WAV-Datei als Binärdatei, lege sie in einen Puffer und möchte die exakt gleiche WAV-Datei erneut schreiben.C - Schreiben eines Puffers als Binärdatei (wav)

Hier ist mein Code so weit:

file = fopen("tone1.wav", "rb"); 
file3 = fopen("outout.wav","wb"); 
fseek(file, 0, SEEK_END); 
fileLen=ftell(file); 
fseek(file, 0, SEEK_SET); 
buffer=(char *)malloc(fileLen+1); 
buffer3=(char *)malloc(fileLen+1); 
fread(buffer, fileLen, 1, file); 
for (int i=0;i<fileLen+1;++i){ 
    buffer3[i]=buffer[i]; 
    fwrite(buffer3,sizeof(buffer3),1,file3); 
} 
fclose(file); 
fclose(file3); 
free(buffer); 
free(buffer3); 

Das Problem ist, dass die outout WAV-Datei leer und unspielbar kommt. Ich bin mir nicht sicher, was ich falsch mache. Wenn ich fwrite(buffer3,sizeof(buffer3),1,file3); durch fwrite(buffer3,sizeof(buffer3),1048,file3); (sagen wir 1048) ersetze, bekomme ich etwas spielbares aber nicht das gesamte wav mit einer Schleife darin.

Kann mir jemand sagen, was ist das Problem? Vielleicht ist es die Länge der for-Schleife, die falsch ist, vielleicht sollte ich fileLen nicht als Grenze dafür setzen? Womit soll ich 1 ersetzen?

Vielen Dank im Voraus

+2

'sizeof (buffer3)' - nicht tun, was Sie denken, dass es ist; das ist die Größe eines * Zeigers *. Und ich bin mir nicht wirklich sicher, ob du das "fwrite" in der Schleife haben willst. – WhozCraig

+0

du hast Recht ich ersetzte es durch sizeof (char) aber immer noch das gleiche (da meine Puffer auf Zeichen zeigen) –

Antwort

0

Nicht innerhalb der Schleife schreiben.
Oder schreiben Sie jedes Mal verschiedene Zeichen (nicht immer buffer3[0]).

fread(buffer, fileLen, 1, file); 
for (int i = 0; i < fileLen; ++i) { 
    // transform and copy 
    buffer3[i] = transform(buffer[i]); 
    //fwrite(buffer3 + i, 1, 1, file3); // write 1 character only 
} 
fwrite(buffer3, fileLen, 1, file3); // write all the new buffer 
+0

ich verstehe jetzt. Vielen Dank –

0

I löste es durch fwrite(buffer3,sizeof(char),78000,file3); außerhalb der for-Schleife Einlochen, mit 78000 die Größe des file1 ist. Aber meine Frage ist, wie kann ich wissen, was ist ihre Größe durch Code?

+0

Die Größe ist 'fileLen'. – pmg

1

Bitte beachten Sie Folgendes:

  • die Tatsache, dass die Datei „raw“ und hat eine „.wav“ Erweiterung, wie Sie es nennen, ist weder meine, es ist eine wav Datei noch macht eine wav feil dich raus. Um eine wav Datei zu werden, benötigt es einen gültigen WAV-Header und benötigt eine geeignete Audiodatei-API zum Lesen und Schreiben. Was Sie lesen und kopieren ist headerless Daten des unbekannten Formats und unbekannten endianess.
  • Wenn Sie Standardbibliothek C-Funktionen zum Kopieren von Inhalten von einer Datei in eine andere verwenden möchten, tun Sie es auf der Byte-Ebene, ohne den Inhalt zu interpretieren, was Sie tun.

In diesem Fall gibt es einige Probleme in Ihrem Code:

  1. redundante Polsterung der Puffer und die Rückkehr der malloc in C Gießen:
    buffer = malloc(fileLen); funktionieren soll.
  2. mehrdeutige Logik: Warum, wenn Sie die Quelldatei in einem Durchgang gelesen haben, kopieren beide Puffer und schreiben in die Zieldatei byte-by-byte, innerhalb der Schleife?
  3. selbst wenn ja, übergeben Sie immer noch falsche Argumente zu fread und fwrite Funktionen, überprüfen Sie bitte man Seiten.
    fread(buffer, 1, fileLen, file); sollte das Lesen beheben. (1 entspricht sizeof (char)).
  4. Warum benötigen Sie einen redundanten Puffer buffer3, wenn Sie den Inhalt der Datei nicht interpretieren?
  5. Auch wenn dies der Fall ist, übergeben Sie immer noch falsche Argumente an Ihre Funktionen innerhalb der Schleife.Dies sollte das Update tun:

    for (int i=0; i<fileLen; i++){ 
        buffer3[i]=buffer[i]; 
        fwrite(&(buffer3[i]),1,1,file3); 
    } 
    

Im Allgemeinen weiß man nicht die Größe der Datei im Voraus, bevor die Quelldatei zu öffnen. So weist man den Puffer von angemessener Größe zu, liest und schreibt dann in Blöcke, die durch die Größe des Puffers bestimmt sind. In diesem Fall sollte Ihre Lese-Routine auch die Pufferunterlaufbedingung behandeln.