Ecriture dans fichier texte de l'IFS

RPG (3 et 4, free), CL, SQL, etc...
Répondre
manae
Messages : 58
Enregistré le : mar. 21 juin 2011, 07:08:24

Ecriture dans fichier texte de l'IFS

Message 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

cmasse
Site Admin
Messages : 802
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

close

Message par cmasse »

Remplacez

Code : Tout sélectionner

CloseFile(%addr(PathFile));
par

Code : Tout sélectionner

CloseFile(FilePtr);  
Christian Massé (Volubis.fr)

cmasse
Site Admin
Messages : 802
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

options(*string)

Message 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;                 
Christian Massé (Volubis.fr)

manae
Messages : 58
Enregistré le : mar. 21 juin 2011, 07:08:24

Message par manae »

Merci pour votre réponse.

Cordialement

manae
Messages : 58
Enregistré le : mar. 21 juin 2011, 07:08:24

Message 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]

cmasse
Site Admin
Messages : 802
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

option(*string)

Message 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....
Christian Massé (Volubis.fr)

Répondre