fgets(由文件中读取一字符串)
相关函数 open,fread,fscanf,getc
表头文件 include<stdio.h>
定义函数 har * fgets(char * s,int size,FILE * stream);
函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。
返回值 gets()若成功则返回s指针,返回NULL则表示有错误发生。
范例 #include<stdio.h>
main()
{
char s[150];
fputs(fgets(s,150,stdin),stdout);
}
执行 ,输入:
Hello world
输出:
Hello world
fputs(将一指定的字符串写入文件内)
相关函数 fopen,fwrite,fscanf,fputc,putc
表头文件 #include<stdio.h>
定义函数 int fputs(const char * s,FILE * stream);
函数说明 fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。
返回值 若成功则返回写出的字符个数,返回EOF则表示有错误发生。
fgets()存储输入中的换行符,而fputs()也不为输出添加换行符。
strtok()用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串,当strtok()在参数str的字符串中发现到参数delimiters的分割字符时则会将该字符改为'\0'字符。在第一次调用时,strtok()必需给予参数str字符串,往后的调用则将参数str设置成NULL。
C/C++中的Split函数是strtok()其函数原型如下:
char * strtok (char * str, const char * delimiters);
函数说明
strtok()用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串,当strtok()在参数str的字符串中发现到参数delimiters的分割字符时则会将该字符改为'\0'字符。在第一次调用时,strtok()必需给予参数str字符串,往后的调用则将参数str设置成NULL。每次调用成功则返回下一个分割后的字符串指针。
返回值 返回下一个分割后的字符串指针,如果已无从分割则返回NULL。
下面到底哪个是数组指针,哪个是指针数组呢:
A)
long *pa[6];
B)
long (*pb)[6];
每次上课问这个问题,总有弄不清楚的。这里需要明白一个符号之间的优先级问题。
“[]”的优先级比“*”要高。
pa 先与“[]”结合,构成一个数组的定义,数组名为pa,long *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向long 类型数据的指针,即指针数组。
至于pb ,“()”的优先级比“[]”高,“*”号和pb 构成一个指针的定义,指针变量名为pb,long 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。pb 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。
下面程序完成一个简单的单机投票系统:
1. 1.dat与2.dat存放了2个投票的相关内容,投票内容可以依次增多,按数字增序排列。
1.dat:
4
您最喜欢的语言
javascript
python
C++
java
2
2.dat:
4
您最喜欢的操作系统
windows
ubuntu
freebsd
Solaris
1
2.投票程序每次运行后都会读取上次投票的结果,并保存本次投票结果,结果保存为csv文件。
3.候选人及相关数据保存在下面2个结构中tphsr.h:
#ifndef TPHSR_H_INCLUDED
#define TPHSR_H_INCLUDED\
//候选人结构
struct tp_hsr{
int id;
char name[10];//候选人
int sel_count;//候选人选票
};
typedef struct tp_hsr TpHsr;
struct tp_hsr_info{
TpHsr *tphsr;//候选人明细
int hsrcount;//候选人总数
char outfn[200];//候选人导出文件名
char xzinfo[200];//选举内容
int sel_max;//最大候选人
};
typedef struct tp_hsr_info TpHsrInfo;
#endif // TPHSR_H_INCLUDED
其它代码如下:
tp.h:
#ifndef TP_H_INCLUDED
#define TP_H_INCLUDED
#include <string.h>
#include <conio.h>
#include "tphsr.h"
#define PASSWD_LEN 100//密码最大长度
#define HSR_MAXLEN 100//候选人模板每行长度
#define TMPL_FL_PATH "template/"
#define FDCOUNT 2
void showbegin(){
system("cls");
printf(" * **** *********** * * * **** * * \n");
printf(" * * * * * * * * * * * ***** * * \n");
printf(" * * * ********* ***** * * * * ******\n");
printf(" **** * * * * * * * * *********** * * * * * \n");
printf(" * * ** ********* *** * * * ****** *** * * \n");
printf(" * * ******* * * * ** * * *\n");
printf(" * ****** ********* * * * ** * ** ** * * ******\n");
printf(" ** * * * * * ********* ********** **** * * *\n");
printf(" *** * * *********** * * * * * * * * * \n");
printf(" * * * * * ** *********** * * * ** * * \n");
printf(" * * * * * * * * * * * * ** * * *\n");
printf(" ** ** ** * ** * * ******* * * ** * * **\n");
printf(" \n投 好 庄 严 一 票\n ");
printf(" # ####### # ##### # \n");
printf(" # # # # # # # # # # # ##### \n");
printf(" # # # # # # # # # # # # \n");
printf(" # # ######### # # # # # # # # # \n");
printf(" # # # # # # # ### \n");
printf(" # # # # # # ####### # # # # \n");
printf(" # # # # # # # # # # # \n");
printf(" #### # # # #### # # #### # ####### \n");
}
TpHsrInfo* read_hsr_template(char *templ_fn){
//读取候选人模板文件
FILE *hsrfp;
int hsrcount=0;
char strline[HSR_MAXLEN];
char myfilename[200]="";
char outfn[200]="";
char *xz_info;
strcat(myfilename,TMPL_FL_PATH);
strcat(myfilename,templ_fn);
if((hsrfp = fopen(myfilename,"rt")) == NULL)
{
return NULL;
}
//取得候选人总数
//第一行为候选人总数
fgets(strline,HSR_MAXLEN,hsrfp);
hsrcount=atoi(strline);
//取得选举内容
//第二行为选举内容
fgets(strline,HSR_MAXLEN,hsrfp);
xz_info=strline;
TpHsrInfo *myhsrinfo=(TpHsrInfo*)malloc(sizeof(TpHsrInfo));
TpHsr *myhsr=malloc(sizeof(TpHsr)*hsrcount);
myhsrinfo->tphsr=myhsr;
myhsrinfo->hsrcount=hsrcount;
strncpy(myhsrinfo->xzinfo,xz_info,strlen(xz_info)-1);
myhsrinfo->xzinfo[strlen(xz_info)-1]='\0';
strcat(outfn,myhsrinfo->xzinfo);
strcat(outfn,".csv");
strcpy(myhsrinfo->outfn,outfn);
int i=0;
while (!feof(hsrfp))
{
fgets(strline,HSR_MAXLEN,hsrfp); //读取一行
strline[strlen(strline)-1]='\0';
myhsrinfo->tphsr[i].id=i+1;
strcpy(myhsrinfo->tphsr[i].name,strline);
myhsrinfo->tphsr[i].sel_count=0;
i++;
if (i>=hsrcount) break;
}
fgets(strline,HSR_MAXLEN,hsrfp);
myhsrinfo->sel_max=atoi(strline);
fclose(hsrfp);
return myhsrinfo;
}
TpHsrInfo* load_hsr(char *templ_fn ){
//读文件
FILE *hsrin_fp;
int hsrcount=0;
int i=0;
const char *csvflag=",";
char * p;
char strline[HSR_MAXLEN+10];
int sel_ct=0;
char* sel_ctstr[5];
TpHsrInfo *tphsrinfo=read_hsr_template(templ_fn);
if(tphsrinfo==NULL){
return NULL;
}
if((hsrin_fp = fopen(tphsrinfo->outfn,"rt")) == NULL)
{
return tphsrinfo;
}
while (!feof(hsrin_fp))
{
fgets(strline,HSR_MAXLEN+10,hsrin_fp);
p = strtok (strline,csvflag);
p = strtok(NULL,csvflag);
if (!p) break;
strcpy(sel_ctstr,p);
sel_ct=atoi(sel_ctstr);
tphsrinfo->tphsr[i].sel_count=sel_ct;
i++;
}
fclose(hsrin_fp);
return tphsrinfo;
}
void save_hsr(TpHsrInfo *tphsrinfo){
//写文件
FILE *hsrout_fp;
int hsrcount=0;
char linestr[300]={0};
int i=0;
char sel_ctstr[5]="";
if((hsrout_fp = fopen(tphsrinfo->outfn,"wt")) == NULL)
{
printf("%s创建错误!",tphsrinfo->outfn);
return NULL;
}
for(i=0; i<tphsrinfo->hsrcount;i++)
{
strcpy(linestr,tphsrinfo->tphsr[i].name);
strcat(linestr," ,");
sprintf(sel_ctstr,"%d",tphsrinfo->tphsr[i].sel_count);
strcat(linestr,sel_ctstr);
strcat(linestr,"\n");
fputs(linestr,hsrout_fp);
}
fclose(hsrout_fp);
}
int select_hsr(TpHsrInfo *tphsrinfo){
//显示候选人
int i=0;
int xz=0;
int hsrsel_max=tphsrinfo->sel_max;
int now_selhsr_ct=1;
system("cls");
printf("-------%s\-------\n",tphsrinfo->xzinfo);
for(i=0; i<tphsrinfo->hsrcount;i++)
{
printf("%d-",tphsrinfo->tphsr[i].id);
printf(tphsrinfo->tphsr[i].name);
printf(" 票数:%d",tphsrinfo->tphsr[i].sel_count);
printf("\t");
if ((i+1)%FDCOUNT==0) printf("\n");
}
printf("请输入编号(输入0表示弃权):");
scanf("%d",&xz);
while (1){
if (xz<0 || xz>tphsrinfo->hsrcount){
printf("-------%s\-------\n",tphsrinfo->xzinfo);
for(i=0; i<tphsrinfo->hsrcount;i++)
{
printf("%d-",tphsrinfo->tphsr[i].id);
printf(tphsrinfo->tphsr[i].name);
printf(" 票数:%d",tphsrinfo->tphsr[i].sel_count);
printf("\t");
if ((i+1)%FDCOUNT==0) printf("\n");
}
i=0;
printf("请输入编号:");
scanf("%d",&xz);
}
else if (xz==0) {
printf("您弃权了!");
return 0;
}
else {
printf("您选择:%d-%s",tphsrinfo->tphsr[xz-1].id,tphsrinfo->tphsr[xz-1].name);
tphsrinfo->tphsr[xz-1].sel_count++;
now_selhsr_ct++;
if (now_selhsr_ct<=hsrsel_max) {
xz=-1;
continue;
}
return 1;
}
}
}
void showtip(){
printf("\n每位候选人均有一个编码,输入选中的编码后,按回车键即表示投票!\n按任意键开始投票\n");
getch();
}
int passwd_check(){
//密码检测,成功返回1,否则返回0
showbegin();
int i;
char mypass[100];
char accept[]="gxds"; //正确登录密码
printf("投票选举系统\n");
printf("请输入密码:");
char pswd;
for(i=0; i<PASSWD_LEN-1; i++)
{
pswd=getch();
if (pswd==0x0d) break;
else mypass[i]=pswd;
printf("*");
}
mypass[i]='\0';
if (strcmp(mypass,accept)==0)
{
printf("\n密码正确!下面开始投票!\n");
return 1;
}
else{
printf("\n密码错误!按任意键退出程序!\n");
getch();
return 0;
}
}
#endif // TP_H_INCLUDED
Main.c
//投票软件-单机版
//纯C,请使用code::blocks打开工程,并编译
#include <stdio.h>
#include "tp.h"
#define TPL_MAX 20
int main(int argc,char *argv[]){
int is_pass=passwd_check();
TpHsrInfo *tphsrinfo[TPL_MAX];
int now_jx=0;
char nowjxfn[20]="";
int max_jx=0;
while(1){
if (is_pass) {
sprintf (nowjxfn,"%d",now_jx+1);
strcat(nowjxfn,".dat");
tphsrinfo[now_jx]=load_hsr(nowjxfn);
if (tphsrinfo[now_jx]==NULL) {
max_jx=now_jx;
break;
}
showbegin();
showtip();
select_hsr(tphsrinfo[now_jx]);
now_jx++;
}
else return 0;
}
now_jx=0;
for (now_jx=0;now_jx<max_jx;now_jx++){
save_hsr(tphsrinfo[now_jx]);
free(tphsrinfo[now_jx]->tphsr);
free(tphsrinfo[now_jx]);
}
return 0;
}