Fichier .wav

Signaler
Messages postés
47
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
28 décembre 2010
-
 Utilisateur anonyme -
bonjour,
j'ai un problème c'est que je veux écrire des données sur un fichier .wav mais il me donne à chaque fois une erreur d'entrée sortie:
i/o error 32 ou  i/o error 1784. le fichier où je veux écrire si il existe les données ne sont pas écrite et il me donne des fois une erreur des deux. voici le code que j'ai utiliser(c'est un code pour faire l'expérience seulement):

procedure TForm1.Button2Click(Sender: TObject);
var f:file;nom_rep:string;o:integer;i:integer;
begin
nom_rep:='C:\Documents and Settings\conversation téléphonique';
   if(fileexists(nom_rep+'\conv1'+'.wav')=false) then
        begin
            FileCreate(nom_rep+'\conv1'+'.wav');
        end;
AssignFile(F,nom_rep+'\conv1'+'.wav');
   for i:=1 to 1000 do
      begin
         o:=i;
         Reset(F,1000*sizeof(o));
         blockwrite(F,o,sizeof(o));
   end;
end;

10 réponses

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Un reset dans une boucle ca me parait bizarre... De plus tu ne close jamais ton fichier avant de le réouvrir.

Salut

CptPingu a raison mais surtout il y a une autre erreur Reset(F,1000*sizeof(o));

----Citation : ----

The Reset procedure opens a file given by FileHandle for read, write or read and write access.

 

You must use AssignFile to assign a file to the FileHandle before using Reset.

 

Use Write or WriteLn to write to the file after this Reset is executed.

 
Version 1
 

Is used for text files. They can only be read after opening with Reset.

 
Version 2
 

Is for binary files.
Before using Reset, you must set FileMode to one of the following:

 
fmOpenRead , : Read only, ----
fmOpenWrite , : Write only, ----
fmOpenReadWrite , : Read and write
--------------------------------

Voila ta procédure modifiée (et ca fonctionne) :

procedure TForm1.Button1Click(Sender: TObject);
var f:file;MyFile:string;i:integer;
begin
   MyFile:='C:\conv1.Wav';//On fait un test =>On utilise MyFile : plus simple pour la suite
   Button1.Enabled:=False;// Permet de savoir quand la procedure est finit : évite les beugs
   if not fileexists(MyFile) then FileCreate(MyFile);
   for i:=1 to 1000 do
      begin
         AssignFile(F,MyFile);
         //O:=I : Ca ne sert à rien du tout
         Rewrite(F,1);// Et c'est quoi ce truc pas beau à la place du 1 (1=Write only)
         blockwrite(F,i,sizeof(i));
         CloseFile(F);//On ferme aussi le fichier
   end;
   Button1.Enabled:=True;
end;

Pour finir : les Blocks c'est finit, on utilise les streams maintenant

@+
Messages postés
47
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
28 décembre 2010

je viens d'utiliser les streams mais j'ai le boutton qui se bloque, voici le code:



procedure TForm1.Button1Click(Sender: TObject);
var i:integer; stream:Tstream;MyFile:String;
begin
MyFile:='C:\Documents and Settings\conversation téléphonique\conv.wav';//On fait un test =>On utilise MyFile : plus simple pour la suite
   Button1.Enabled:=False;// Permet de savoir quand la procedure est finit : évite les beugs
   if not fileexists(MyFile) then Stream := TFileStream.Create(MyFile, fmcreate);
   for i:=1 to 1000 do
      begin
         Stream.Write(i, SizeOf(i));
      end;
   Button1.Enabled:=True;
   Stream.Free;
end; 


"Si tu veux du miel, résiste au piqure des abeilles"

Re,

Chez moi il ya rien qui se bloque . Par contre il y avait un message d'alerte parlant d'initialisation du Stream : tu l'as pas vu celui la ?

Cette procédure fonctionne sans beug de boutons.

procedure TForm1.Button1Click(Sender: TObject);
var i:integer; stream:Tstream;MyFile:String;
begin
  MyFile:='C:\conv.wav';
  If FileExists(MyFile) then exit;
  Button1.Enabled:=False;
  Stream := TFileStream.Create(MyFile, fmcreate);
  for i:=1 to 1000 do
    Stream.Write(i, SizeOf(i));
  Stream.Free;
  Button1.Enabled:=True;
end;

Tu peux retirer les instructions en rouge.

@+ et n'oublie pas de valider le message
Messages postés
47
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
28 décembre 2010

je ne comprends pas, il arrive une chose bizzard: Quand j'excécute le programme et je clique sur le boutton, le fichier est créé et les données sont envoyées vers le fichier. mais quand je clique sur le boutton une deuxieme fois il disparrait...
voici le code de tout le programme:

unit Unit2;



interface



uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;



type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;



    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;



var
  Form1: TForm1;
  f:file;
  nom_rep:string;
  const MyFile:string='C:\aaa\conv.wav';
  CONST HEADER:ARRAY[0..43]OF BYTE=(
$52,$49,$46,$46, $00,$00,$00,$00, $57,$41,$56,$45, $66,$6D,$74,$20,
$10,$00,$00,$00, $01,$00,$01,$00, $44,$AC,$00,$00, $88,$58,$01,$00,
$02,$00,$10,$00, $64,$61,$74,$61, $00,$00,$00,$00);
implementation



{$R *.dfm}





procedure TForm1.Button1Click(Sender: TObject);
var i:integer; stream:Tstream;
begin
  If not FileExists(MyFile) then Stream := TFileStream.Create(MyFile, fmcreate);
 for i:=1 to 100 do
    Stream.Write(i,SizeOf(i));
  Stream.Free;
end;





procedure TForm1.Button2Click(Sender: TObject);
begin
halt;
end;


end.


"Si tu veux du miel, résiste au piqure des abeilles"
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
begin
  if FileExists(MyFile) then
     { code pour fichier existant }

  with TFileStream.Create(MyFile, fmCreate) do
  try
    { code }
  finally
    Free;
  end;
end;
Messages postés
47
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
28 décembre 2010

je veux faire un programme qui va copier les échantillons que je récuppere de mon port parallèle sur un fichier .wav. mais le truc c'est que j'arrive même pas à écrire dans un fichier .wav, ça me donne des erreurs. j'utilise mnt les streams et toujours des problemes: ça ne s'enregistre que lorsque le fichier est créé pour la premiere fois. est ce que quelqu'un connait comment faire pour écrire des données à la fin d'un fichier .wav et quesque je dois écris à l'entete du dichier si je veux un son 8 bits, mono.
merci.  

"Si tu veux du miel, résiste au piqure des abeilles"

Je me demande si tu formules bien ta question :  Déjà ta procédure avec les blocks ne rajoutait pas les donnés mais les substituait. Ensuite, la derniere procédure fonctionne parfaitement que l'on clicke une fois ou plusieurs fois : le fichier est toujours recréé.

Si maintenant tu veux rajouter des données à un fichier existant, il est normal qu'avec TStreamFile.Create('myfile.abc',fmCreate) détruise le fichier précédent.

Pour rajouter des données à un fichier existant il faut l'ouvrir en écriture
(MySteam := TStreamFile.Create('myfile.abc',fmOpenWrite) puis se placer à la fin du flux (MySteam.Position:=MyStream.Size).

Maintenant si ce n'est pas ca, j'abandonne : j'y comprends rien à ton probleme moi
Messages postés
47
Date d'inscription
mercredi 13 juin 2007
Statut
Membre
Dernière intervention
28 décembre 2010

bjr,
pour ajouter des données à la fin de mon fichier .wav j'ai utilisé l'instruction (MySteam := TStreamFile.Create('myfile.abc',fmOpenWrite)) ( merci Franky ).
j'ai écrit une procedure Delay pour provoquer le retard en lecture de deux bits qui arrive sur une pin du port parallèle. le problème c que je ne sais pas combien dure cette procedure....
le code de cette procedure est simple:
procedure Delay(i:integer);
   begin
      for j:=1 to i do 
         begin 
         end;
   end;
par exemple pour Delay(1000) combien cela va durer
merci pour tous.
"Si tu veux du miel, résiste au piqure des abeilles"

Amine,

1)Apprend à chercher par toi meme via google.
2)Une question par topic.

Pour faire une pause on utilise l'instruction sleep(durée en milliseconde) et on utilise application.processmessages pour éviter toute paralysie.