【问题标题】:fopen in Mainframe (C language)大型机中的 fopen(C 语言)
【发布时间】:2014-03-10 07:08:17
【问题描述】:

我正在从大型机打开一个文件。目前,我无法访问我想要的输入文件。我不知道C代码或我的JCL是否有问题。有人帮帮我吗?

这是我的代码:

int main()                                               
{                                                        

 FILE *ifp, *ofp;                                        

 printf("CTRACE1\n");                                    
 ifp = fopen("dd:INPUTF", "rb, recfm=vb, lrecl=50");     
 printf("CTRACE2\n");                                    
 ofp = fopen("dd:OUTPUTF","w");                          
 printf("CTRACE3\n");                                    

 fread( buffer, sizeof( char ), LINESZ, ifp );           
 printf( "Number of characters read = %i\n", num );

 printf( "buffer = %s\n", buffer );                         

 dstr = (DATASTR*) buffer;                                  

 printf("VAR_A = %.*s\n", sizeof(dstr->VAR_A), dstr->VAR_A);
 printf("VAR_B = %.*s\n", sizeof(dstr->VAR_B), dstr->VAR_B);
 printf("VAR_C = %.*s\n", sizeof(dstr->VAR_C), dstr->VAR_C);
 printf("CTRACE4\n");                                       

 x[sizeof(x)+1]='\0';                                       
 y[sizeof(y)+1]='\0';                                       
 z[sizeof(z)+1]='\0';                                       
 printf("CTRACE5\n");                                       


 memcpy(x, dstr->VAR_A,sizeof(dstr->VAR_A));                
 memcpy(y, dstr->VAR_B,sizeof(dstr->VAR_B));                
 memcpy(z, dstr->VAR_C,sizeof(dstr->VAR_C));                
 printf("CTRACE6\n");                                       

 printf("%s,%s,%s",x,y,z);                                  
 printf("CTRACE7\n");                                       

 fwrite(buffer, sizeof(char), LINESZ, ofp);                 

 fprintf(ofp,"%s,%s,%s\n",x,y,z);                           


 fclose(ifp);                                               
 fclose(ofp);                                               
 return(0);                                                 
}                      

这是我的 JCL:

... //* TYPRUN=扫描 //JOBLIB DD DSN=X543863.LOADLIB1,DISP=SHR //STEP1 执行 PGM=CCCGRATE //INPUTF DD DSN=X543863.SAMPLE.INPUT01,DISP=SHR //OUTPUTF DD DSN=X543863.SAMPLE.OUTPUT01, // DISP=(新,CATLG,删除), // 空间=(CYL,(1,1,45)), // DCB=(RECFM=FB,LRECL=50) //SYSOUT DD SYSOUT=* //

【问题讨论】:

  • 您需要添加一些错误检查 - 永远不要调用 fopen 并假设它会成功。当fopen 返回NULL 时不要忘记检查errno
  • 如果这是您同时处理C 和大型机的起点,我强烈建议您切换到更易于管理的脚本语言,例如python
  • 你得到什么输出?是否有任何 CTRACE 行有效?
  • @VorsPrung ctrace 行有效。问题是,由于某种原因,它无法访问输入文件。
  • @PaulR 是的。我会在它工作后进行错误检查谢谢。

标签: c mainframe


【解决方案1】:

在不确切知道你得到什么输出的情况下,充其量很难说。

您是否尝试将可变长度记录复制到固定长度记录?

两件事。在输入文件的 fopen 上,您不需要指定 DCB 信息 - 因此不需要 recfm=vblrecl=50(如果未指定信息,将从 JCL(如果存在)或目录中获取(这将是正确的))。

既然不需要它们,你可能弄错了:-)

取下它们,然后尝试你的程序。

看看你有什么并为输出指定,要么 vb 是错误的(你正在编写一个 fb),要么是 50 是错误的(如果你有 50 个字节的数据,你在逻辑上从你的 fb 定义中得到,vb 的 lrecl 应该是 54,因为数据需要额外的四个字节来包含 RDW(记录描述符字)。

你的JCL没有问题,但无法判断文件和文件定义是否正确。

现在就交给你了。如果仍然无法修复,请提供所有可能的信息。

【讨论】:

  • 嘿,比尔。我尝试删除 recfm=vb 和 lrecl=50 ,但仍然无法访问输入文件。并感谢您的回答。仍然是在大型机上运行 C 的新手。
  • 谢谢比尔!我已经让它工作了。这是与 th vb-fb 的事情。谢谢!
【解决方案2】:

添加一个

#include <errno.h>

重写 open() 调用以捕获错误

if (!ifp = fopen("dd:INPUTF", "rb, recfm=vb, lrecl=50"))
  { 
  perror("ifp");
  exit(1);
  }     
 printf("CTRACE2\n");                                    
 if (!ofp = fopen("dd:OUTPUTF","w"))
  {
  perror("ofp");
  exit(1);
  }

你应该知道为什么输入文件不起作用

【讨论】:

  • 嘿Vorsprung。我认为我使用的大型机不支持 errno.h 库。我无法让它在我的代码上运行。
  • 查看“大型机”的手册(什么样的大型机??),了解如何使用 perror 或 errno
  • 是的。 errno.h 是标准 C 库的一部分,它工作得非常好(根据经验)。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 2014-12-13
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多