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;
}
应该是因为读取行数把第一行那个表头那一行也计算了,减去这一行就可以了。
测试代码如下:
参考链接:
#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;
}