c语言fwrite写字符串数组,【字符串数组面试题】面试问题:C语言 文… - 看准网...

1.文件中存储的学生信息按照班级编号升序排列,每个班级的人数可以不同,要求读取文件中所有学生的成绩,计算每个班级的平均成绩,将班级编号和平均成绩输出。

存储格式:

145811  fuxin             100

145811  chengxian     90

145812  zhangxue     92

145812  lijun              88

145813  ha                100

145813  hd                300

145813  hf                 200

#include

#include

int main()

{

int num=0; //班级人数计数

int sumScore =0; //累计成绩

int curClass=0; //当前班级

int curScore=0; //当前成绩

int lastClass=0; //上一个班级

int readItems=0; //正确读入数据数目

FILE *fin; //输入文件

fin=fopen("score.dic","r");

if(!fin) //文件打开失败

{

fprintf(stderr,"error open file!"); //输出错误信息到标准输出

exit(-1); //强制退出,并返回错误码

}

lastClass=0;

char s[100];

while((readItems=fscanf(fin,"%d %*s %d",&curClass,&curScore))!=EOF) //*表示跳过

{

if(readItems!=2)

break;

if(lastClass==curClass||lastClass==0)

{

num++;

sumScore +=curScore;

lastClass=curClass;

}

else

{

if(num==0)

return 0;

printf("%d\t%d\n",lastClass,sumScore/num);

sumScore=curScore;

lastClass=curClass;

num=1;

}

}

printf("%d\t%d\n",lastClass,sumScore/num);

fclose(fin);

}

2.用fgetc函数从键盘逐个输入字符,然后用fputc函数写到磁盘文件即可

#include

#include

int main()

{

FILE *fp;

char ch;

if((fp=fopen("file.dat","w"))==NULL)

{

printf("error open file");

exit(1);

}

printf("请输入字符串,以#结束:\n");

while((ch=getchar())!='#')

{

fputc(ch,fp);

putchar(ch); //在屏幕上显示字符

}

fclose(fp);

putchar(10); //向屏幕输出一个换行符

return 0;

}

3.将一个磁盘文件中的信息复制到另一个磁盘文件中

int main()

{

FILE *fin,*fout;

int ch;

fin=fopen("fin.dat","r");

fout=fopen("fout.dat","w");

if(fin==NULL||fout==NULL)

{

fprintf(stdin,"error open files");

}

while((ch=fgetc(fin))!=EOF) //注意ch是int类型

fputc(ch,fout);

fclose(fin);

fclose(fout);

printf("复制文件成功");

return 0;

}

如果使用feof()函数判断是否到达文件末尾,需要注意先读取再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。因为在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。

//错误,多输出一行FF

while(!feof(fp))

{

c = fgetc(fp);

printf("%X\n",c);

}

//正确

c = fgetc(fp);

while(!feof(fp))

{

printf("%X\n",c);

c = fgetc(fp);

}

4 从键盘读入若干字符,对它们按照字母大小排序,然后把排好序的字符串送到磁盘文件保存

#define MAXSIZE 1000

int main()

{

FILE *fp;

char str[MAXSIZE];

int ch;

int i;//字符个数

if((fp=fopen("file.dat","w"))==NULL)

{

printf("error open file");

exit(1);

}

i=0;

//从键盘获取数据

while((ch=getchar())!=EOF)

{

if(i==(MAXSIZE))

{

if(fputs(str,fp)==EOF)//向文件输入数据

{

printf("error output to file");

exit(1);

}

i=0;

}

//插入排序

if(i==0)

{

str[i]=ch;

}

else

{

int j;

for(j=i-1;j>=0&& ch

{

str[j+1]=str[j];

}

str[j+1]=ch;

}

i++;

}

if(i>0)

fputs(str,fp);

fclose(fp);

return 0;

}

5 从键盘读入若干字符串,对它们按照字母大小排序,然后把排好序的字符串送到磁盘文件保存

#include

#include

#include

#define MAXLINES 100 //最大行数

#define MAXLEN 1000 //一行最大长度

char *lineptr[MAXLINES]; //指向字符串的指针数组

//返回长度

int getline(char*s,int lim)

{

int c;

char *t=s;

while(--lim>0&&(c=getchar())!=EOF &&c!='\n')

*s++=c;

if(c =='\n')

*s++=c;

*s='\0';

return s-t;

}

int readlines(char *lineptr[],int maxlines)

{

int len,nlines;

char *p,line[MAXLINES];

nlines=0;

while((len=getline(line,MAXLEN))>0)

if(nlines>=maxlines ||(p=(char*)malloc(sizeof(len)))==NULL)

return -1;

else

{

line[len-1]='\0';

strcpy(p,line);

lineptr[nlines++]=p;

}

return nlines;

}

void writeline(char*lineptr[],int nlines,FILE *fp)

{

while(nlines-->0)

{

printf("%s\n",*lineptr);

fputs(*lineptr++,fp);

fputs("\n",fp);//输入换行符

}

}

void swap(char *v[],int i,int j)

{

char *temp;

temp=v[i];

v[i]=v[j];

v[j]=temp;

}

void qsort(char *v[],int left,int right)

{

int i,last;

if(left>right)

return;

swap(v,left,(left+right)/2);

last=left;

for(i=left+1;i<=right;i++)

if(strcmp(v[i],v[left])<0)

swap(v,++last,i);

swap(v,left,last);

qsort(v,left,last-1);

qsort(v,last+1,right);

}

int main()

{

FILE *fp;

if((fp=fopen("file.dat","w"))==NULL)

{

printf("error open file");

exit(1);

}

printf("Enter strings:\n");

int nlines;//读取行数

if((nlines=readlines(lineptr,MAXLINES))>0)

{

qsort(lineptr,0,nlines-1);

writeline(lineptr,nlines,fp);

}

else

{

printf("error input");

}

fclose(fp);

}

6 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去

#define SIZE 10

struct Student_type{

char name[10];

int num;

int age;

char addr[15];

}stud[SIZE]; //全局结构体数组

void save()

{

FILE*fp;

int i,j;

if((fp=fopen("student.dat","wb"))==NULL)

{

printf("error open file\n");

exit(1);

}

for(i=0;i

{

if((j=fwrite(&stud[i],sizeof(struct Student_type),1,fp))!=1)

printf("file write error\n");

}

fclose(fp);

}

void read()

{

FILE *fp;

if((fp=fopen("student.dat","rb"))==NULL)

{

printf("erroe open file");

exit(1);

}

for(int i=0;i

{

fread(&stud[i],sizeof(struct Student_type),1,fp);

printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);

}

fclose(fp);

}

int main()

{

int i;

printf("Please enter data of students:\n");

for(i=0;i

{

scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);

}

save();

read();

return 0;

}

7 有一个磁盘文件,内有一些信息。要求第一次将它的内容显示在屏幕上,第2次把它复制到另一个文件上

void rewind(FILE *stream)

设置文件位置为给定流stream的文件的开头

int main()

{

FILE *fp1,*fp2;

fp1=fopen("fin.dat","r");

fp2=fopen("fout.dat","w");

if(!fp1||!fp2)

{

printf("error open file");

exit(1);

}

while(!feof(fp1))

{

putchar(getc(fp1));

}

putchar(10);//换行

rewind(fp1);//使文件位置标记返回文件头

while(!feof(fp1))

{

putc(getc(fp1),fp2);

}

fclose(fp1);

fclose(fp2);

return 0;

}

8 在磁盘文件上存有10个学生的数据区的开头,从磁盘文件读入相应学生的信息,并把它显示在屏幕上

#define SIZE 10

struct Student_type{

char name[10];

int num;

int age;

char addr[15];

}stud[SIZE];

int main()

{

int i;

FILE *fp;

if((fp=fopen("student.dat","rb"))==NULL)

{

printf("error open file");

exit(1);

}

for(i=0;i

{

fseek(fp,i*sizeof(struct Student_type),0);

fread(&stud[i],sizeof(struct Student_type),1,fp);

printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);

}

fclose(fp);

return 0;

}

9 有两个磁盘文件,各存放一行字母,今要求把这两个文件中的信息合并(按照字母顺序排列),输出到一个新文件中

int main()

{

FILE *fp1,*fp2,*fp3;

fp1=fopen("fin.dat","r");

fp2=fopen("fout.dat","r");

fp3=fopen("file.dat","w");

if(!fp1||!fp2||!fp3)

{

printf("error open file");

exit(1);

}

char c[1000];//存储数据

int i,j,k,ch;

puts("fileA:");

for(i=0;(ch=getc(fp1))!=EOF&&ch!='\n';i++)

{

c[i]=ch;

putchar(c[i]);

}

puts("\nfileB:");

for(;(ch=getc(fp2))!=EOF&&ch!='\n';i++)

{

c[i]=ch;

putchar(c[i]);

}

for(j=0;j

for(k=0;k

if(c[k]>c[k+1])

{

int temp=c[k];

c[k]=c[k+1];

c[k+1]=temp;

}

puts("\nfileC:");

for(j=0;j

{

putc(c[j],fp3);

putchar(c[j]);

}

fclose(fp1);

fclose(fp2);

fclose(fp3);

return 0;

}

10 两个班的成绩分别存放在两个班的成绩分别存放在两个文件当中。 每个文件有多行, 每行都是由空格分隔的学号、姓名和成绩。现在要将两个班的成绩合并到一起进行排序按照成绩从高到低,如果相同则按学号由小到大排序。将结果输出一个文件当中。两个输入文件名与输出文件名使用命令行参数指定。请你编写一个程序完成上述功能

#include

#include

#include

#define MAXN 200

struct stuNode

{

char stuID[20];

char name[20];

int score;

};

typedef struct stuNode stuType;

int myCompare(stuType m,stuType n)

{

if(m.score!=n.score)

return n.score-m.score;

else

return strcmp(m.stuID,n.stuID);

}

int cmp(const void *a,const void *b)

{

stuType m=*(stuType*)a, n=*(stuType*)b;

return myCompare(m,n);

}

void loadData(FILE* fp,stuType *m)

{

int i=0;

while(fscanf(fp,"%s",m[i].stuID)!=EOF)

{

fscanf(fp,"%s%d",m[i].name,&m[i].score);

i++;

}

qsort(m,i,sizeof(stuType),cmp);

m[i].score=-1; // set -1 as bounder

}

void merge(stuType *a,stuType *b)

{

stuType tmp[MAXN];

int i=0,j=0,index=0;

while(a[i].score>0 && b[j].score>0)

{

if(myCompare(a[i],b[j])<0)

tmp[index++]=a[i++];

else

tmp[index++]=b[j++];

}

while(a[i].score>0)

tmp[index++]=a[i++];

while(a[i].score>0)

tmp[index++]=b[j++];

tmp[index].score=-1;

for(i=0;i

a[i]=tmp[i];

}

int main(int argc,char* argv[])

{

stuType a[MAXN],b[MAXN];

FILE *fin1,*fin2,*fout;

int i;

fin1=fopen(argv[1],"r");

fin2=fopen(argv[2],"r");

fout=fopen(argv[3],"w");

if(!fin1||!fin2||!fin3)

{

printf("error open file");

exit(1);

}

loadData(fin1,a);

loadData(fin2,b);

merge(a,b);

for(i=0;a[i].score>0;i++)

{

fprintf(fout,"%s %s %d\n",a[i].stuID,a[i].name,a[i].score);

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值