2

IFS にはさまざまな CCSID (0、37、819、1200、1252 など) を持つファイルが多数あり、ユーザーがこれらのファイルの内容。

私たちのシステム (V6R1) CCSID (DSPSYSVAL QCCSID) は 65535 [2] で、ジョブのデフォルト CCSID は 37 です。つまり、たとえば CCSID 819 (ASCII) を表示しようとすると、記号やランダムな色などのゴミが表示されます。

私はQtqIconvOpen APIを介してある CCSID から別の CCSID にデータを変換することに精通しているので、ファイルにデフォルトの CCSID とは異なる CCSID があることがわかっている場合は、それを変換できます。私はそれを行うために何年も前にコードを書きましたが、それはうまくいきます。

私の問題は、プログラムで IFS ファイルの CCSID を見つけることです。グーグルで検索した後、私が見つけた唯一の関連情報は、JamesA ( CPYFRMIMPF コマンドで使用される CCSID を決定する方法は? ) の Stackoverflow で、QSHELL で「ls -S」を実行して、CCSID を示すファイルのリストを取得できることを指摘していますとファイル名。

したがって、理論的には、 を実行しls -S filename、出力を解析して CCSID を取得し、必要に応じてその CCSID を使用してデータの変換を実行できます。ただし、これは見苦しいハックであり、可能であれば IBM API を使用したいと考えています。

からリストを解析するよりも、そのようなAPIまたはよりエレガントなハックを知っている人はいますls -S filenameか?

[1] C API を使用open()read()close()、実際のデータの読み取りを行います。

[2] 65535 が悪い選択であることはわかっていますが、それについて私にできることは何もありません。

4

3 に答える 3

4

統合ファイル システム API からstat()関数を使用できます。

プロトタイプの定義は次のようになります。

D stat            PR            10I 0 ExtProc('stat')                   
D   path                          *   Value Options(*string)            
D   buf                               Likeds(statDS)

次に、stat データ構造も必要です。

 D statDS          DS                  Qualified Template
 D  st_mode                      10U 0
 D  st_ino                       10U 0
 D  st_nlink                      5U 0
 D  st_reserved2                  5U 0
 D  st_uid                       10U 0
 D  st_gid                       10U 0
 D  st_size                      10I 0
 D  st_atime                     10I 0
 D  st_mtime                     10I 0
 D  st_ctime                     10I 0
 D  st_dev                       10U 0
 D  st_blksize                   10U 0
 D  st_allocsize                 10U 0
 D  st_objtype                   11A
 D  st_reserved3                  1A
 D  st_codepage                   5U 0
 D  st_ccsid                      5U 0
 D  st_rdev                      10U 0
 D  st_nlink32                   10U 0
 D  st_rdev64                    20U 0
 D  st_dev64                     20U 0
 D  st_reserved1                 36A
 D  st_ino_gen_id                10U 0

それを使うのはとても簡単です

 D fileStats       DS                  Likeds(statDS)

  /free
     if stat('/path/to/file': fileStats) < 0;
        // error handling
     endif;

     // ccsid now in fileStats.st_ccsid
  /end-free
于 2013-04-26T13:09:10.093 に答える
0

これに DSPF を使用しない理由はありますか? IBM のユーティリティは素晴らしい仕事をします。何が必要なのかわかりません。

于 2013-04-17T16:12:44.357 に答える