SCAU高级语言程序设计--实验12 文件操作(2)
二、堂下练习
1、文本文件操作---读取与选择显示
题目: 在当前目录中存在文件名为"case1.in"的文本文件,现要求打开该文件,读出里面的所有字符,只将其中的数字字符按先后顺序显示在屏幕上。 (如case1.in内容如下) 13 cats and 22 bikes (在屏幕上输出结果如下) 1322
#include "stdio.h"
main()
{
FILE *fp;
char ch;
if((_______________________)==NULL)
return 0;
while(_______________________)
{
_______________________
}
fclose(fp);
}
思路:打开文件->读取文件内容->判断是否为数字->若是数字就打印出来->关闭文件
#include<stdio.h>
main(){
FILE *fp;
char ch;
if((fp=fopen("case1.in","r"))==NULL)//打开文件
return 0;
while((ch=fgetc(fp))!=EOF){//循环读取文件字符内容
if(ch>='0'&&ch<='9')//判断是否为数字
putchar(ch);//若是数字,打印出来
}
fclose(fp);//关闭文件
}
2、文本文件操作---单词的排序
题目:在当前目录有文件“case1.in”,文件里存放有多个(总个数不超过10000个)英文单词(每个英文单词不会超过10个字文字符), 每行一个,单词未排序。现要求,将文件中的所有单词按字典顺序排序,然后将排序好的单词写入新建的文件answer.txt中(注:文件存放于当前目录)。 请完成程序,实现该功能,(注意,填空题,请不要使用return 0结束,否则会影响评判而判错)
(如case1.in文件中原内容如下) hello bye yes (程序执行后,在文件answer.txt中内容如下) bye hello yes
#include "stdio.h"
#include "string.h"
main()
{
_______________________
}
思路:
1、首先,把data1.in文件中的所有单词都读取在二维数组中。
(每一行就是1个单词,str数组总共可以读10000个数组。注意列要设置为11,因为考虑到最后的‘\0’字符。)
2、读取字符串的函数为fscanf(),和scanf()的参数类似,只是fscanf()多了第一个参数指定读哪个文件。
(fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束,而且只是读单个字符。)
(fscanf的返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)。所以我们这里判断有单词返回值肯定>0)
3、单词排序就和数字由小到大排序一样,这里判断的函数用了strcmp()函数。这个函数比较两个字符串,从左到右依次比较。若str1==str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
例如,str1=hello,str2=apple,因为第一个字符‘h’>'a',所以str1>str2,返回正数。又例如,str1=hello,str2=heaao,因为第三个字符‘l’>'a',所以str1>str2,返回正数。
这样我们逐个字符串比较,就可以字母顺序把数组重新排序,即使遇到前几个字符有相同的单词也能排序。
4、最后循环把新数组写入新文件里面。用的函数为fprintf(),函数类似于printf(),只是多了第一个参数指定写入哪个文件。
#include<stdio.h>
#include<string.h>
main(){
FILE *fp1,*fp2;
char str[10000][11],str1[11];
int n=0,i,j;
/*打开文件*/
if((fp1=fopen("data1.in","r"))==NULL)//以读的方式打开文件1,
return 0;
if((fp2=fopen("answer.txt","w"))==NULL)//以写得方式打开文件2
return 0;
/*读取每一个单词到数组*/
while((fscanf(fp1,"%s",str[n]))>0)//循环读取文件字符串内容到数组
n++;
/*单词的排序*/
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(strcmp(str[i],str[j])>0){//判断两个字符是否一致
//两个数组交换
strcpy(str1,str[i]);
strcpy(str[i],str[j]);
strcpy(str[j],str1);
}
}
}
/*写入文件*/
for(i=0;i<n;i++){
fprintf(fp2,"%s",str[i]);
}
/*关闭文件*/
fclose(fp1);
fclose(fp2);
}