C初心者のリナです。
以下のような課題をだされて自分なりにコーディングしてみたものの行き詰まってます・・・。
誰かアドバイスください。お願いします。
1)最終処理日から機械処理日までを含む年月を、処理対象年月として算出する。
(処理対象年月は複数存在する場合あり)
2)電子ファイリング格納ディレクトリと処理対象年月から、
電子ファイリングINDEXファイルのパスを作成する。
電子ファイリング格納ディレクトリ +処理対象日の年月 + .DAT
3)処理対象年月毎の電子ファイリングINDEXファイルから、
新たに添付された帳票を取得する。
検索条件は以下の通り
最終処理日<ファイリング日<=機械処理日
取得するデータは以下の通り
設計書番号、ファイリング日
4)電子ファイリング格納ディレクトリと取得した設計書番号、
ファイリング日付から、ファイルのパスとBACKUPパスを作成する。
ファイルのパス:電子ファイリング格納ディレクトリ + ファイリング日の年月 + /
+ 設計書番号 + ファイリング日 + .tar.Z
BACKUPパス:電子ファイリングBACKUPディレクトリ + ファイリング日の年月 + /
+ 設計書番号 + ファイリング日 + .tar.Z
入力(SEKKEISYO_INFO)ファイル名(200112.DAT)
150074450,20011216
150074450,20011217
入力(SEKKEISYO_INFO)ファイル名(200201.DAT)
150074450,20010110
150074450,20010111
機械処理日=20011201
最終処理日=20020131
出力ファイル名
15007445020011216.tar.Z
15007445020011217.tar.Z
15007445020020110.tar.Z
15007445020020111.tar.Z
#define ELECTRONFILE_TAR_EXTNAME .tar /* アーカイブファイル名拡張子 */
#define ELECTRONFILE_COMP_EXTNAME .Z /* 圧縮ファイル名拡張子 */
#define ELECTRONFILE_INDEX_EXTNAME .DAT /* インデックスファイル名拡張子 */
typedef struct sekkeisyo_info
{
char szSekkeisyoNo[9 + 1]; /* 設計書番号 */
char szEndDate[8 + 1]; /* ファイリング日付 */
} SEKKEISYO_INFO ;
/* 配列用INDEX */
#define ORG_DIR (0) /* 格納ディレクトリ */
#define BACKUP_DIR (1) /* BACKUPディレクトリ */
typedef struct file_info /* 当日異動ファイル情報 */
{
char szOrgPath [256 + 1]; /* 格納ファイルのパス */
char szBackupPath[256 + 1]; /* BACKUPファイルのパス */
} FILE_INFO ;
extern char gszNowDate [8 + 1]; /* 機械処理日 */
extern char gszLastDate [8 + 1]; /* 最終処理日 */
extern FILE_INFO gElecFileDir; /* 電子ファイリング格納DIR */
/* PG開始 */
int GetElecFile( FILE_INFO **pFileInfo,
int
*piFileCnt )
{
int ret ;
/*戻り値 */
int i = 0 ;
int j = 0 ;
int iRecCnt ;
int iCnt = 0 ;
char szPath [ MAX_PATH ] ;
char szEndym [6 + 1] ;
char szSyoriDate [10][6 + 1] ;
SEKKEISYO_INFO *ptr ;
FILE *fp ;
/*処理対象年月の算出*/
while( 1 ){
for( i=1 ; i<iCnt ; i++ ){
/*処理年月毎の電子ファイリングINDEXファイルパスを作成*/
memset ( szPath, 0x00, sizeof( szPath )) ;
strcpy( szPath, gElecFileDir.szOrgPath ) ;
strcat( szPath, szSyoriDate[i] ) ;
strcat( szPath, ELECTRONFILE_INDEX_EXTNAME ) ;
/*電子ファイリングINDEXファイルを読み込み*/
ret = fopen( szPath, rb ) ;
if( ret == NULL ) {
return( ret ) ;
}
/*電子ファイリングINDEXファイル情報領域取得*/
*ppFileInfo = realloc( *ppFileInfo, sizeof( FILE_INFO ) * ( *piFileCnt +
1 ));
if ( *ppFileInfo == NULL ) {
return( ret ) ;
}
/*電子ファイリングINDEXファイルレコード件数の取得*/
iRecCnt = GetRecCnt( fp, sizeof(SEKKEISYO_INFO) ) ;
if( !iRecCnt ){
fclose( fp ) ;
return( 0 ) ;
}
ret = fread( ptr, sizeof(SEKKEISYO_INFO), iRecCnt, fp ) ;
if( ret < iRecCnt ){
fclose( fp ) ;
return( ret ) ;
}
fclose( fp ) ;
for( j=0 ; j<iRecCnt ; j++ ){
if ((ptr+i)->sekkeisyo_info.szEndDate < gszLastDate ) continue ;
if ((ptr+i)->sekkeisyo_info.szEndDate > gszNowDate ) continue ;
memset( *ppFileInfo + *piFileCnt, 0x00, sizeof( FILE_INFO )) ;
memset( szEndym, 0x00, sizeof( szEndym )) ;
strncpy( szEndym, (ptr+i)->sekkeisyo_info.szEndDate, 6 ) ;
/*新ファイルパス作成*/
strcpy((*ppFileInfo + *piFileCnt)->szOrgPath,
gElecFileDir.szOrgPath ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath, szEndym ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath, '/' ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath, (ptr+i)-
>sekkeisyo_info.szSekkeisyoNo ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath, (ptr+i)-
>sekkeisyo_info.szEndDate ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath,
ELECTRONFILE_TAR_EXTNAME ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath,
ELECTRONFILE_COMP_EXTNAME ) ;
/*バックアップファイルパス作成*/
strcpy((*ppFileInfo + *piFileCnt)->szBackupPath,
gElecFileDir.szBackupPath ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath, szEndym ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath, '/' ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath, (ptr+i)-
>sekkeisyo_info.szSekkeisyoNo ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath, (ptr+i)-
>sekkeisyo_info.szEndDate ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath,
ELECTRONFILE_TAR_EXTNAME ) ;
strcat((*ppFileInfo + *piFileCnt)->szOrgPath,
ELECTRONFILE_COMP_EXTNAME ) ;
*piFileCnt++ ;
}
}
}
int GetRecCnt( FILE *fp, int RecSize )
{
int ret ;
long fsize ;
int cnt ;
if( RecSize == 0 ) return( 0 ) ;
ret = fseek( fp, 0L, SEEK_END ) ;
if( ret == -1 ) return( 0 ) ;
fsize = ftell( fp ) ;
if( fsize == -1 ) return( 0 ) ;
if( fsize == 0 ) return( 0 ) ;
cnt = (int)fsize/RecSize ;
ret = fseek( fp, 0L, SEEK_SET ) ;
if( ret == -1 ) return( 0 ) ;
return( cnt ) ;
}
ここはC#(しーしゃーぷ)の掲示板です
後別のC言語の掲示板で質問する場合何処でどのように行き詰まっているか
ということを書いてないと 示されたソースコードを全て読んで実行してみて
どういう不具合が出ててそれからどのようにして解決するかということまで
してくれる人は少ないと思います。