Page 1 sur 1

Ecriture dans fichier texte de l'IFS

Posté : jeu. 15 sept. 2016, 10:15:24
par manae
Sans message d'erreur, impossible d’écrire dans un fichier texte.
Le fichier est bien créé mais reste vide.
Voici le code que j'utilise.

Code : Tout sélectionner

      **free
       ctl-opt option(*srcstmt) dftactgrp(*no);

       dcl-pr OpenFile pointer extproc('_C_IFS_fopen');
         *n pointer value; // file name
         *n pointer value; // file mode
       END-PR;

       dcl-pr WriteFile pointer extproc('_C_IFS_fputs');
         *n pointer value; // string to write
         *n pointer value; // open mode
       END-PR;

       dcl-pr CloseFile extproc('_C_IFS_fclose') ;
         *n pointer value ;  // Misc pointer
       end-pr ;

       dcl-s PathFile char(50) ;
       dcl-s OpenMode char(100);
       dcl-s FilePtr pointer inz;
       dcl-s SndData char(25);
       dcl-s i packed(3);

       PathFile = '/test_write.txt' + x'00';
       OpenMode = 'w,o_ccsid=1252' + x'00';

       FilePtr = OpenFile(%addr(PathFile):%addr(OpenMode));
       if (FilePtr = *null) ;
         dsply ('Unable to open file (1)');
         return;
       endif;

       CloseFile(%addr(PathFile));

       OpenMode = 'a,o_ccsid=1252' + x'00'; 
       FilePtr = OpenFile(%addr(PathFile):%addr(OpenMode));
       if (FilePtr = *null);
        dsply ('Unable to open file (2)');
        return;
       endif;

       for i = 1 to 10;
        SndData = 'Write No. '+ %char(i)+x'0D'+x'0A';
        WriteFile(%addr(SndData):FilePtr);
       endfor;

       CloseFile(%addr(PathFile));

       *inlr=*on;
      **end-free
Cordialement

close

Posté : jeu. 15 sept. 2016, 16:21:01
par cmasse
Remplacez

Code : Tout sélectionner

CloseFile(%addr(PathFile));
par

Code : Tout sélectionner

CloseFile(FilePtr);  

options(*string)

Posté : jeu. 15 sept. 2016, 16:27:39
par cmasse
Pour infos, OPTIONS(*STRING) évite d'ajouter X'00' et de passer %ADDR()

Code : Tout sélectionner

**free
ctl-opt option(*srcstmt) dftactgrp(*no);

dcl-pr OpenFile pointer extproc('_C_IFS_fopen');
  *n pointer value options(*string); // file name
  *n pointer value options(*string); // file mode
END-PR;

dcl-pr WriteFile pointer extproc('_C_IFS_fputs');
  *n pointer value options(*string); // string to write
  *n pointer value; // open mode
END-PR;

dcl-pr CloseFile extproc('_C_IFS_fclose') ;
  *n pointer value ;  // Misc pointer
end-pr ;

dcl-s PathFile char(50) ;
dcl-s OpenMode char(100);
dcl-s FilePtr pointer inz;
dcl-s SndData char(25);
dcl-s i packed(3);

PathFile = '/formation/test_write.txt';
OpenMode = 'w, o_ccsid=1252';

FilePtr = OpenFile(PathFile:OpenMode);
if (FilePtr = *null) ;
  dsply ('Unable to open file (1)');
  return;
endif;

CloseFile(FilePtr);

OpenMode = 'w';
FilePtr = OpenFile(PathFile:OpenMode);
if (FilePtr = *null);
  dsply ('Unable to open file (2)');
  return;
endif;

for i = 1 to 10;
  SndData = 'Write No. '+ %char(i)+x'0D'+x'0A';
  WriteFile(SndData:FilePtr);
endfor;

CloseFile(FilePtr);

*inlr=*on;                 

Posté : jeu. 15 sept. 2016, 17:05:08
par manae
Merci pour votre réponse.

Cordialement

Posté : mer. 21 sept. 2016, 14:27:22
par manae
Bonjour,

j'ai fait les modifs que vous préconisez.
Aprés un essai je constate un effet bizarre sur le nom des fichiers dans l'ifs

Opt Lien objet Type Attribut Texte
__ test_write.txt STMF
__ test_write.txt > STMF

Si dans le code je mets PathFile = '/marc/test_write.txt'+x'00'; j'ai la première ligne
Si je mets PathFile = '/marc/test_write.txt'; j'obtiens la 2éme ligne avec un >

Je pense que le x'00' reste utile pour la fin du nom de fichier.
Qu'en pensez-vous ?

Cordialement
[/code]

option(*string)

Posté : lun. 26 sept. 2016, 07:29:04
par cmasse

Code : Tout sélectionner

options(*string)
doit ajouter un X'00 ou zéro héxa (obligatoire pour les chaines en C) automatiquement.

donc je dirais, non pas de concaténation de x'00'

ensuite WRKLNK ajoute un > à chaque fois que le nom de fichier ne s'affiche pas entièrement, F22 permet de voir le nom en entier....