Fichier .wav

AmineTheGreat Messages postés 47 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 28 décembre 2010 - 13 juin 2007 à 12:20
 Utilisateur anonyme - 14 juin 2007 à 15:27
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 juin 2007 à 12:34
Un reset dans une boucle ca me parait bizarre... De plus tu ne close jamais ton fichier avant de le réouvrir.
0
Utilisateur anonyme
13 juin 2007 à 13:00
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

@+
0
AmineTheGreat Messages postés 47 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 28 décembre 2010
13 juin 2007 à 13:58
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"
0
Utilisateur anonyme
13 juin 2007 à 14:14
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
AmineTheGreat Messages postés 47 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 28 décembre 2010
13 juin 2007 à 16:38
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"
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
13 juin 2007 à 17:14
begin
  if FileExists(MyFile) then
     { code pour fichier existant }

  with TFileStream.Create(MyFile, fmCreate) do
  try
    { code }
  finally
    Free;
  end;
end;
0
AmineTheGreat Messages postés 47 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 28 décembre 2010
13 juin 2007 à 19:04
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"
0
Utilisateur anonyme
13 juin 2007 à 20:47
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
0
AmineTheGreat Messages postés 47 Date d'inscription mercredi 13 juin 2007 Statut Membre Dernière intervention 28 décembre 2010
14 juin 2007 à 11:20
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"
0
Utilisateur anonyme
14 juin 2007 à 15:27
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.
0
Rejoignez-nous