トップ 一覧 置換 検索 ヘルプ RSS ログイン

AS400でC言語を使うの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
http://hp.vector.co.jp/authors/VA019876/

!Hello World
 #include<stdio.h>
   void main(){
       printf("Hello, World! ??/n"); 
   }
※「??/」は三文字表記で'¥を表す。最近のAS400では「\n」でも大丈夫みたい?

コンパイル
 CRTCMOD
 CRTPGM

!システムAPIを使う
システムAPIでDSM画面クリア
 #include<stdio.h> 
 #include "QSYSINC/H/QSNAPI" 
 
  void main() {
      QsnClrScl(_C_Get_Ssn_Handle(), '0', NULL); 
      printf("Hello, World!??/n"); 
  } 

!ファイルの読み書き
AS/400のC言語環境でファイルI/Oを行うには、大きく3種類の方法が存在します。
::RPGなどと同じく、AS/400のファイル(PF,LF,DSPF,PRTF,ICFFなど)にレコード単位でI/Oする
:::ILE−Cには、そのための関数群が提供されています。これらAS/400独自の関数を使うことにより RPGなどとある程度同じイメージで、レコード単位のファイルI/Oが可能です。 

::Cから、ファイル(ストリームファイル)にI/Oする標準関数を使い、AS/400のPF,LFに出力する
:::Cからは連続したバッファー出力を行うと、OS/400が物理ファイルのレコード形式にマップする。 Cからは連続したストリームファイルに見えるが、実際のデータは、ファイルの長さに分割されて出力される。 

::Cから、ファイル(ストリームファイル)にI/Oする標準関数を使い、IFS(統合ファイルシステム)に出力する。
:::IFS(統合ファイルシステム)は、ライブラリー形式以外に、標準のストリームファイル形式をサポートしています。そのため、ほぼ、他のプラットフォーム(UNIX,WINDWOS系)とコンパチの使い方が可能になります。 

!標準関数でアクセス
 #include <stdio.h>
 
 int main(void) {
   FILE      *fp;
   char data[100];
 
   if (( fp = fopen ( "CLAB/CLAB1P", "ab" )) == NULL ) {
     printf ( "OPEN ERROR\n" );
     exit ( 1 );
   }
 
   memcpy(data,"1234", 4);
   fwrite(data, sizeof(char), 4, fp);
   fclose ( fp );
   return(0);
 }

!レコード単位でファイルへアクセス
 #include <stdio.h>                                                    
 #include <stdlib.h>                                                   
 #include <recio.h>                                                    
                                                                       
 typedef struct {                                                      
    char srcseq[6];                                                    
    char srcdat[6];                                                    
    char srcdta[80];
  } SRC;                                                       
                                                               
  int main(void)                                               
  {                                                            
    _RFILE      *fp;                                           
    SRC         src;                                           
                                                               
      if (( fp = _Ropen ( "CLAB/CLAB1P", "ar" )) == NULL )     
      {                                                        
          printf ( "OPEN ERROR\n" );                           
          exit ( 1 );                                          
      }                                                        
                                                               
       memcpy(src.srcseq,"000100",6);                          
       memcpy(src.srcdat,"999999",6);                          
       memset(src.srcdta,'A',80);                              
                                                               
       _Rwrite(fp, &src, 92);                                  
                                                               
      _Rclose ( fp );
 
      return(0); 
  }                                        
,コード,機能
,rr,レコードの読取り専用
,wr,レコードの書込み専用。データがある場合には消去された後書込み。
,ar,ファイルの終りへのレコードの書込み(追加)
,rr+,レコードの読取り、書込み、更新
,wr+,レコードの読取り、書込み、更新。データがある場合消去された後書込み。
,ar+,レコードの読取りおよび書込。すべてのデータはファイルの終りに書込

読込時は
 _Rreadn (FP, C ,RECLEN  ,__DFT) ; //ロック
 _Rreadn (FP, C ,RECLEN  ,__NO_LOCK) ; //ロックしない

!DDSの定義を構造体としてincludeする
※*SHOWUSRオプションで、コンパイルするとコンパイルリストに構造体名が書かれているのでチェックする

 #include <stdio.h>                                                   
 #include <stdlib.h>                                                  
 #include <recio.h>                                                   
 // #pragma mapinc("適当な名前","QDBLIB/TABLE(*all)","input or both")      
 #pragma mapinc("SRC","CLAB1P(*all)","both")                      
 #include "SRC"                                                       
 
 int main(void)
 {                 
   _RFILE                            *fp;                             
   CLAB_CLAB1P_CLAB1P_both_t         src;                             
                                                         
    if (( fp = _Ropen ( "CLAB/CLAB1P", "ar" )) == NULL ) 
    {                                                    
        printf ( "OPEN ERROR\n" );                       
        exit ( 1 );                                      
    }                                                    
                                                         
     memcpy(src.SRCSEQ,"000100",6);                      
     memcpy(src.SRCDAT,"999999",6);                      
     memset(src.SRCDTA,'A',80);                          
                                                         
     _Rwrite(fp, &src, 92);                              
                                                         
    _Rclose ( fp );                                      
                                                         
     return(0);                                          
}
 }

{{category2 AS400}}
{{category2 OS,AS400}}