子任务1:逐行读取一个文本文件的内容,并打印输出 (15min)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
char *line=NULL;
size_t len=0;
ssize_t read;
fp=fopen("./text1.txt","r");
if(fp==NULL)
exit(EXIT_FAILURE);
while((read = getline(&line,&len,fp))!=-1){
printf("%s",line);
}
free(line);
exit(EXIT_SUCCESS);
fclose(fp);
}
运行:
子任务2:字符串数组练习。使用二维数组创建字符串数组,把输入的多个字符串存储到字符串数组中,最后打印输出字符串数组。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int n,i;
scanf("%d\n",&n);
char buf[100][100];
for(i=0;i<n;i++){
fgets(buf[i],sizeof(buf[i]),stdin);
}
for(i=0;i<n;i++){
fputs(buf[i],stdout);
}
return 0;
}
运行:
子任务3:字符串数组练习。从终端输入多个字符串,使用malloc函数创建字符串数组,把输入的多个字符串存储到字符串数组中,最后打印输出字符串数组。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int n,i;
scanf("%d\n",&n);
char **buf=(char **)malloc(10*sizeof(char*));
for(i=0;i<n;i++){
buf[i]=malloc(sizeof(char)*10);
}
for(i=0;i<n;i++){
strcpy(buf[i],fgets(buf[i],sizeof(buf[i]),stdin));
}
for(i=0;i<n;i++){
fputs(buf[i],stdout);
}
for(i=0;i<n;i++){
free(buf[i]);
}
free(buf);
return 0;
}
运行:
子任务4:熟悉使用qsort库函数对整数数组由小到大进行排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void *a,const void *b)
{
return (*(int*)a-*(int*)b);
}
int main()
{
int n,i;
scanf("%d\n",&n);
int buf[10];
for(i=0;i<n;i++){
scanf("%d",&buf[i]);
}
qsort(buf,n,sizeof(int),cmp);
printf("输出:\n");
for(i=0;i<n;i++){
printf("%d\n",buf[i]);
}
return 0;
}
运行:
子任务5:对一个文本文件的各行字符串按照字母表顺序进行排序,并打印输出排序后的各行字符串(30min)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void* a,const void* b)
{
return strcmp(*(char**)a,*(char**)b);
}
int main()
{
FILE *fp;
fp=fopen("./test1.txt","r+");
char *line=NULL;
size_t len=0;
ssize_t read;
int i=0;
char **buf=(char **)malloc(6*sizeof(char *));
for(i=0;i<6;i++){
buf[i]=(char *)malloc(10*sizeof(char));
}
i=0;
while((read=getline(&line,&len,fp))!=-1){
strcpy(buf[i],line);
i++;
}
qsort(buf,6,sizeof(buf[0]),cmp);
for(i=0;i<6;i++)
printf("%s",buf[i]);
for(i=0;i<6;i++)
free(buf[i]);
free(buf);
fclose(fp);
return 0;
}
运行:
子任务6:删除文本文件中重复的行,并将结果保存到新的文件中。(对重复的行只保留一行,新文件中的文本行按照字母表顺序排列,保持原文件内容不变)(30min)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void* a,const void* b)
{
return strcmp(*(char**)a,*(char**)b);
}
int main()
{
FILE *fp;
fp=fopen("./test1.txt","r+");
char *line=NULL;
size_t len=0;
ssize_t read;
int i=0;
char **buf=(char **)malloc(6*sizeof(char *));
char **buf2=(char **)malloc(6*sizeof(char *));
for(i=0;i<6;i++){
buf[i]=(char *)malloc(10*sizeof(char));
buf2[i]=(char *)malloc(10*sizeof(char));
}
i=0;
while((read=getline(&line,&len,fp))!=-1){
strcpy(buf[i],line);
i++;
}
qsort(buf,6,sizeof(buf[0]),cmp);
FILE *fp2;
fp2=fopen("./test2.txt","w");
int j=0;
for(i=0;i<5;i++){
for(j=i+1;j<6;j++){
if(strcmp(buf[i],buf[j])==0){
buf[i]=NULL;
break;
}
}
}
j=0;
for(i=0;i<6;i++){
if(buf[i]!=NULL){
strcpy(buf2[j],buf[i]);
fwrite(buf2[j],sizeof(char),strlen(buf2[j]),fp2);
j++;
}
}
for(i=0;i<6;i++){
free(buf[i]);
free(buf2[i]);
}
free(buf);
free(buf2);
fclose(fp);
fclose(fp2);
return 0;
}
运行:
子任务7:求两个已按字母表顺序排好序且没有重复行的文本文件的并集,并将结果写入到新文件中(新文件也要求是按字母表顺序排好序的,且没有重复行的)。(30min)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void* a,const void* b)
{
return strcmp(*(char**)a,*(char**)b);
}
int main()
{
FILE *fp;
FILE *fp2;
fp=fopen("./io1.txt","r+");
fp2=fopen("./io2.txt","r+");
char *line=NULL;
size_t len=0;
ssize_t read;
int i=0;
char **buf=(char **)malloc(6*sizeof(char *));
char **buf2=(char **)malloc(6*sizeof(char *));
for(i=0;i<7;i++){
buf[i]=(char *)malloc(10*sizeof(char));
buf2[i]=(char *)malloc(10*sizeof(char));
}
i=0;
while((read=getline(&line,&len,fp))!=-1){
strcpy(buf[i],line);
i++;
}
while((read=getline(&line,&len,fp2))!=-1){
strcpy(buf[i],line);
i++;
}
qsort(buf,7,sizeof(buf[0]),cmp);
FILE *fbf;
fbf=fopen("./file1_b_file2.txt","w");
int j=0;
for(i=0;i<6;i++){
for(j=i+1;j<7;j++){
if(strcmp(buf[i],buf[j])==0){
buf[i]=NULL;
break;
}
}
}
j=0;
for(i=0;i<7;i++){
if(buf[i]!=NULL){
strcpy(buf2[j],buf[i]);
fwrite(buf2[j],sizeof(char),strlen(buf2[j]),fbf);
j++;
}
}
for(i=0;i<7;i++){
free(buf[i]);
free(buf2[i]);
}
free(buf);
free(buf2);
fclose(fp);
fclose(fp2);
return 0;
}
运行:
子任务8:求两个已按字母表顺序排好序且没有重复行的文本文件的交集,并将结果写入到新文件中(新文件也要求是按字母表顺序排好序的,且没有重复行的)。(30min)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void* a,const void* b)
{
return strcmp(*(char**)a,*(char**)b);
}
int main()
{
FILE *fp;
FILE *fp2;
fp=fopen("./io1.txt","r+");
fp2=fopen("./io2.txt","r+");
char *line=NULL;
size_t len=0;
ssize_t read;
int i=0;
char **buf=(char **)malloc(6*sizeof(char *));
char **buf2=(char **)malloc(6*sizeof(char *));
for(i=0;i<7;i++){
buf[i]=(char *)malloc(10*sizeof(char));
buf2[i]=(char *)malloc(10*sizeof(char));
}
i=0;
while((read=getline(&line,&len,fp))!=-1){
strcpy(buf[i],line);
i++;
}
while((read=getline(&line,&len,fp2))!=-1){
strcpy(buf[i],line);
i++;
}
qsort(buf,7,sizeof(buf[0]),cmp);
FILE *fjf;
fjf=fopen("./file1_j_file2.txt","w");
int j=0;
int flag[7]={0};
for(i=0;i<6;i++){
for(j=i+1;j<7;j++){
if((strcmp(buf[i],buf[j])==0)&&flag[i]==0){
flag[i]=1;
break;
}
}
}
j=0;
for(i=0;i<7;i++){
if(flag[i]==1){
strcpy(buf2[j],buf[i]);
fwrite(buf2[j],sizeof(char),strlen(buf2[j]),fjf);
j++;
}
}
for(i=0;i<7;i++){
free(buf[i]);
free(buf2[i]);
}
free(buf);
free(buf2);
fclose(fp);
fclose(fp2);
return 0;
}
运行:
子任务9:求两个已按字母表顺序排好序且没有重复行的文本文件的差集,并将结果写入到新文件中(新文件也要求是按字母表顺序排好序的,且没有重复行的)。(30min)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void* a,const void* b)
{
return strcmp(*(char**)a,*(char**)b);
}
int main()
{
FILE *fp;
FILE *fp2;
fp=fopen("./io1.txt","r+");
fp2=fopen("./io2.txt","r+");
char *line=NULL;
size_t len=0;
ssize_t read;
int i=0;
char **buf=(char **)malloc(6*sizeof(char *));
char **buf2=(char **)malloc(6*sizeof(char *));
for(i=0;i<7;i++){
buf[i]=(char *)malloc(10*sizeof(char));
buf2[i]=(char *)malloc(10*sizeof(char));
}
i=0;
while((read=getline(&line,&len,fp))!=-1){
strcpy(buf[i],line);
i++;
}
while((read=getline(&line,&len,fp2))!=-1){
strcpy(buf[i],line);
i++;
}
FILE *ff;
ff=fopen("./file1_file2.txt","w");
int j=0;
int flag[4]={0};
for(i=0;i<4;i++){
for(j=4;j<7;j++){
if(strcmp(buf[i],buf[j])==0){
flag[i]=1;
break;
}
}
}
j=0;
for(i=0;i<4;i++){
if(flag[i]==0){
strcpy(buf2[j],buf[i]);
fwrite(buf2[j],sizeof(char),strlen(buf2[j]),ff);
j++;
}
}
for(i=0;i<7;i++){
free(buf[i]);
free(buf2[i]);
}
free(buf);
free(buf2);
fclose(fp);
fclose(fp2);
return 0;
}
运行:
子任务10 文件复制(20分钟)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char* argv[])
{
FILE *fp1=fopen(argv[1],"r");
FILE *fp2=fopen(argv[2],"w");
int flen=0;
char *p;
fseek(fp1,0L,SEEK_END);
flen=ftell(fp1);
p=(char*)malloc(flen+1);
if (p==NULL)
{
fclose(fp1);
return 0;
}
fseek(fp1,0L,SEEK_SET);
fread(p,flen,1,fp1);
fwrite(p,flen,1,fp2);
free(p);
fclose(fp1);
fclose(fp2);
return 0;
}
运行: