说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

C的文件操作问题,实在是弄不明白了。

编辑:说三道四文库 发布时间:2018-06-22 11:00
HTML文档下载 WORD文档下载 PDF文档下载
今天写了这段程序,编译无错误。可运行选2的时候会报程序错误。我看了下,sales.dat文件没有建立成功,估计是这块出了问题,可看了半天也弄不明白哪错,请高手指点~~~(item.dat文件已经存在)      
程序如下:      
#include    <stdio.h>      
#include    <string.h>      
#include    <conio.h>      
#include    <process.h>      
void    Record();      
struct    item      
{      
  int    code;      
  char    name[21];      
  int    tsales;      
  int    ydsales;      
};      
   
struct    sales      
{      
   int    code;      
   int    qsold;      
};      
   
void    main()      
{      
  int    choice=0;      
   
   while    (choice!=7)      
   {      
      system("cls");      
     printf("\tSALES    MONITORING    SYSTEM");      
     printf("\n2.Record    Sale    details");      
     scanf("%d",&choice);
         if (choice==2)      
         Record();      
                                         }      
   
void    Record()      
{      
  FILE    *fp1,    *fp2;      
  struct    item    a[60];      
  struct    sales    b[60];      
  int    i,j,k1,k2,l=0,x=0,y;      
  char    ch,ch1;      
  if((fp1=fopen("item.dat","rb+"))==NULL)      
 {      
   printf("\nUnable    to    open    Item    file.");      
   getchar();getchar();      
   return;      
 }      
  if((fp2=fopen("sales.dat","rb+"))=NULL)      
  {      
    if ((fp2=fopen("sales.dat","wb"))=NULL)      
    {      
      printf("\nUnable    to    open    Sales    file.");      
      getchar();getchar();      
       return;      
     }      
      else      
          l=1;      
  }      
  i=0;      
  k1=fread(&a[i],sizeof(struct    item),1,fp1);      
  while    (k1==1)      
 {      
    i++;      
    k1=fread(&a[i],sizeof(struct    item),1,fp1);      
  }      
    j=0;      
    if    (l==0)      
    {      
      k2=fread(&b[j],sizeof(struct    sales),1,fp2);      
      while    (k2==1)      
      {      
         j++;      
         k2=fread(&b[j],sizeof(struct    sales),1,fp2);      
                                             }      
       }      
       system("cls");      
       printf("\tADD    ITEM    SALE    DETAILS");      
   
       ch='n';      
       while    (ch=='n')      
       {      
         fflush(stdin);      
         printf("\n\nEnter    Item    code:");      
         scanf("%d",&b[j].code);      
         for    (x=0;x<i;x++)      
         {      
           if(b[j].code==a[x].code)      
           {      
             ch='y';      
             break;      
            }      
          }      
            if    (ch=='n')      
            {      
               printf("\n\n\tInvaild    Item    code.please    reenter:");      
               getchar();      
             }      
        }      
          ch='n';      
          while    (ch=='n')      
         {      
           fflush(stdin);      
           printf("\nEnter    Quantity    Sold:");      
           scanf("%d",&b[j].qsold);      
           if  (b[j].qsold<1)      
           {      
            printf("\n\n\tQuantity sold must be greater than 0.Please re-enter");      
            etchar();      
            }      
            else      
            {      
               ch='y';      
             }      
          }      
   
           a[x-1].ydsales+=b[j].qsold;      
                           
           fcloes(fp1);      
   
           fopen("item.dat","rb+");      
   
           for (x=0;x<i;x++)      
          {      
            fwrite(&a[x],sizeof(struct    item),1,fp1);      
          }      
                           
          printf("\nRecord    updated    in    Item    file");      
          fclose(fp1);      
   
          if (l==1)      
                           
          fwrite(&b[j],sizeof(struct    sales),1,fp2);      
                           
          else      
          {      
             fclose(fp2);  
             fp2=fopen("sales.dat","wb+");       
                                                  
             for(y=0;y<i;y++)      
            {      
                fwrite(&b[y],sizeof(struct    sales),1,fp2);      
             }      
           }      
          fclose(fp2);      
          printf("\nRecord    updated    in    Sales    file");      
          getchar();      
                           
          printf("\n\nPress    any    key    to    get    back    :");      
          scanf("%c",&ch1);      
          main();      
}      
   
请帮忙把需要改动的地方指出,谢谢。      
具体内容没有看!
但是最后一句...........................................
可以在普通函数里面调用main函数吗?
和这句没有关系吧,我把它注释了可问题还是存在
[C++ Error] E2120 Cannot call 'main' from within the program
if((fp2=fopen("sales.dat","rb+"))=NULL)      
  {      
    if ((fp2=fopen("sales.dat","wb"))=NULL) 

别的先不说,这两句逻辑上就不行——注意对NULL的判断。
呵呵,是赋值.......
判断比较好的写法是NULL == (fp2=fopen("sales.dat","rb+"))这样就避免了楼主的错误
我有些搞不明白了, main函数内部还可以再定义一个函数体,并且还可以再调用main()。这是什么c?
文件最大的问题就是fopen 就一定要对应fclose,除非fopen是返回值是NULL,不然肯定有问题,main只能有一个,不能卑调用。
帮顶,学习,楼主给点分我就能升级。

楼主问题解决了吗?
确实是 ==NULL那的问题。一开始没看出来。呵呵
子函数里调用main函数应该是不行的,可我的机子上怎么就编译通过并成功运行了呢?郁闷啊!
VC++6.0里确实可以编译通过并运行,估计是编译器问题。楼主最好还是改下程序。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘