大佬们求解决,先输入信息再将信息保存到文件去,使用读行数函数,行数不对

int input(item *it)/*输入丢失物品信息*/
{
   int i=0,flag='y';
   printHead();
   while(flag=='y')
   {   printf("请你输入丢失物品信息:\n");
       scanf("%s%s%s%s%s%s%s%s%s%s",it[i].sign,it[i].indate,it[i].type,it[i].information,it[i].place,it[i].condition,it[i].ownername,it[i].ownerID,it[i].ownernum,it[i].outdate);
       printf("%6s%10s%6s%10s%6s%6s%10s%10s%10s%10s\n",it[i].sign,it[i].indate,it[i].type,it[i].information,it[i].place,it[i].condition,it[i].ownername,it[i].ownerID,it[i].ownernum,it[i].outdate);
       i+=1;printf("登记成功!\n");
       printf("你要再次输入吗?( y or n )\n");getchar();
       scanf("%c",&flag);
   }
   return i;
}
void save(char *fname,item *it,int n)/*创建当天文件*/
{
    int i;
    FILE *fp;
    
    fp=fopen(fname,"a+");
    if(fp==0)
    {
        printf("file error\n");
        exit(1);
    }
    fprintf(fp,"%6s%20s%10s%10s%10s%10s%10s%20s%20s%20s\n","序号","登记时间","类型","具体信息","地点","状态","物主名字","物主学号","物主电话","领取时间");
    for(i=0;i<n;i++)
        fprintf(fp,"%6s%20s%10s%10s%10s%10s%10s%20s%20s%20s\n",it[i].sign,it[i].indate,it[i].type,it[i].information,it[i].place,it[i].condition,it[i].ownername,it[i].ownerID,it[i].ownernum,it[i].outdate);
    printf("保存成功!\n");
    fclose(fp);
}

int duhang(char *name,item *it)/*读取文件的行数*/
{
    FILE *fp;
    char str[SIZE];
    int lines=0;
    fp=fopen(name,"r");
    if(fp==0)
    {
        printf("file erroe\n");
        exit(1);
    }
    while(fgets(str,SIZE,fp)!=0)
        lines++;
    fclose(fp);
    return lines;
}

应该是因为读取行数把第一行那个表头那一行也计算了,减去这一行就可以了。

测试代码如下:

参考链接:


https://blog.csdn.net/shanglala/article/details/108559314



#include <stdio.h> 
#include <stdlib.h>
#define SIZE   168
struct item{
    
    char sign[20];
    char indate[20];
    char type[20];
    char information[50];
    char place[50];
    char condition[20];
    char ownername[20];
    char ownerID[20];
    char ownernum[20];
    char outdate[20];
    
};

void  printHead(){
    printf("欢迎使用失物登记系统\n");
}
int input(struct item *it)/*输入丢失物品信息*/
{
   int i=0,flag='y';
   printHead();
   while(flag=='y')
   {   printf("请你输入丢失物品信息:\n");
       scanf("%s%s%s%s%s%s%s%s%s%s",it[i].sign,it[i].indate,it[i].type,it[i].information,it[i].place,it[i].condition,it[i].ownername,it[i].ownerID,it[i].ownernum,it[i].outdate);
       printf("%6s%10s%6s%10s%6s%6s%10s%10s%10s%10s\n",it[i].sign,it[i].indate,it[i].type,it[i].information,it[i].place,it[i].condition,it[i].ownername,it[i].ownerID,it[i].ownernum,it[i].outdate);
       i+=1;printf("登记成功!\n");
       printf("你要再次输入吗?( y or n )\n");getchar();
       scanf("%c",&flag);
   }
   printf("i=%d\n",i);
   return i;
}
void save(char *fname, struct item *it,int n)/*创建当天文件*/
{
    int i;
    FILE *fp;
    
    fp=fopen(fname,"a+");
    if(fp==0)
    {
        printf("file error\n");
        exit(1);
    }
    fprintf(fp,"%6s%20s%10s%10s%10s%10s%10s%20s%20s%20s\n","序号","登记时间","类型","具体信息","地点","状态","物主名字","物主学号","物主电话","领取时间");
    for(i=0;i<n;i++)
        fprintf(fp,"%6s%20s%10s%10s%10s%10s%10s%20s%20s%20s\n",it[i].sign,it[i].indate,it[i].type,it[i].information,it[i].place,it[i].condition,it[i].ownername,it[i].ownerID,it[i].ownernum,it[i].outdate);
    printf("保存成功!\n");
    //getchar(); 
    fclose(fp);
}

int duhang(char *name)/*读取文件的行数*/
{
    FILE *fp;
    char str[SIZE];
    int lines=0;
    fp=fopen(name,"r");
   // getchar(); 
    if(fp==0)
    {
        printf("file erroe\n");
        exit(1);
    }
    
    // https://baike.baidu.com/item/fgets/10942211?fr=aladdin
   // getchar(); 
    while(fgets(str,SIZE,fp)!=0){
    //    getchar(); 
        lines++;
    }
        
    fclose(fp);
//    getchar(); 
    
     return lines-1; // 去掉标题那一行     

   
}

int main(void){
    
    struct  item it;
    int n = input(&it);
    // https://blog.csdn.net/shanglala/article/details/108559314
    char  fileName[20]="lostData.txt";  // 存储文件名的字符数组 
    save(fileName,&it,n);
    int num=duhang(fileName);
    printf("共有%d条数据!\n",num);
    printf("%d",num);
    
    return 0;
}

img